Telnet与Java实现

1 Telnet基础

 Telnet全称:Tel Type Net。
 端口:23。
 作用:远程登录,明文传输
1.1 Telnet交互过程
1)本地与远程主机建立连接。该过程实际上是建立一个TCP连接,用户必须知道远程主机的IP或者域名;
2)将本地连接上输入的用户名和口令及以后输入的任何命令或字符以NVT(Net Virtual Terminal)格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个IP数据包;
3)将远程主机上输出的VNT格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果;

4)最后,本地终端对远程主机进行撤消连接。该过程是撤销一个TCP连接。

1.2 Telnet应用分析
        从目前的应用来看,我们在哪些情况下回应用到Telnet呢。实际上,在网络环境日趋的混乱,安全形势日趋严峻的今天,绝大多数的设备都已经屏蔽了Telnet,为了提高安全性,日常管理中,应用的更多的是SSH或者通过VPN等方式。既然如此,那为什么还要去实现呢。我个人的观点是难免有些应用场景,比如只是对安全性要求不高的内网机器进行几条简单命令的操作,不会涉及安全。还有一点就是领导的攀比心理,别家的产品有的,我们也必须有,要不然打标的时候会被比下去。作为下属的我们,也只能从命啦。以上仅是个人观点,欢迎指点。

2 Java实现 

       通过上面简要的介绍,我们知道Telnet就是TCP/IP协议簇中的一种,Java要实现Telnet,无非就是做个Socket的客户端,然后向远程主机发送认证命令,然后读取认证结果,通过认证后,再向远程数据发送需要执行的命令,然后读取命令的执行结果。读取完成后,断开连接。过程就是这样,但是,实现没这么简单。
      Apache Commons包中有TelnetClient类,顾名思义,是Telnet协议的客户端实现类,有了它,可以省去我们自己写交互的过程。但是使用时,要注意以下几点:
      1、考虑好终端类型。Telnet有VT100,VT220,VT52等,有个设置不对,就会出现读取乱码。我开始用的时候是VT100,后来发现乱码,改为VT220后解决。
      2、如何判断读取结束。这点我会重点说。
2.1 判断读取结束的解决方案
        由于TelnetClient没有提供发送命令和读取结果的接口,我们只能自己实现,实现的逻辑就是获取客户端中的输入输出流,使用输出流向远程主机发送命令,使用输入流从远程主机读取命令执行结果。由于使用流操作,这样我就必须知道什么时候结束流的读取操作。期初我考虑到两种方案:
        1、配置读取结束读取的标识符,如果读取中读到这个标示符则结束读取。这个方案应该是很多人开始就想到的方案,但是这个方案存在的问题是如果命令的执行结果中就包含这个符号,就会丢失这个符号之后的数据。而且不能方便的覆盖全部的远程主机。
        2、创建固定大小的缓存,如10k,将读取到的数据循环存入缓存,缓存满了就转到成固定的串。一旦发现读取到的avaiable值为-1并且缓存不满则结束读取。这个方案的问题是会造成数据乱码,这个乱码并不是因为字符集导致的,而是因为在我们读取到的数据都是二进制数据,当缓存满时,有可能会将原本属于一个字节的数据分到两个缓存中,这样在转成串时就造成了由于数据不完整,不能转化成正常的字符串,从而导致乱码。
       如此以来,这两种方案都不太好,后来我考虑能不能找到一个标示流数据结束的标识,最终没有找到。但是在这个找的过程中,我想到了最终的解决方案,最终的解决方案思路是:
       1、创建一个固定大小的缓存,将读到的数据写入缓存。
       2、将读到的数据写入数组输出流。
       3、从登陆的数据中自动读取数据的最后一行,作为以后所有数据读取结束的标识。这样做的原因是无论是Windows还是Linux,在命令执行完后,都会输出下一个命令的提示符,这也就表示上一条命令执行结束。 <
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值