telnetlib模块属于Python标准库,实现了一个telnet客户端的功能,可用来自动连接一些设备并进行相应的操作,其使用方式,有点像著名的expect。虽然现在远程连接基本上已经被SSH所取代,但在某些场景下,比如在局域网中连接一些通信设备,telnet还在发挥余热。本文介绍Python的telnetlib模块的使用。
先做点准备工作,我们需要在Linux中安装telnet相关程序,这样才有一个测试环境。默认情况下,现在的Linux发行版本都没有telnet,因为它不是一个安全的通信方式。
引入telnetlib模块
telnetlib模块内主要就是一个Telnet类,因此我们这样来引入:
>>> from telnetlib import Telnet
连接telnet服务器
我已经在Linux中安装了telnet服务器,地址就是本机的环回地址127.0.0.1,telnet服务器默认的端口号是23。
创建Telnet对象的时候,就可以填入telnet服务器地址,以及端口号,如果不填端口号,默认是23号端口。还有一个timeout参数,表示在进行连接时,最长的阻塞时间,如果不填,使用socket全局默认的超时时间。
interact() 函数,表示开始于telnet服务器互动,这个函数调用后,就像我们用手telnet客户端手动登录到服务器上一样,所有的往来交互全手动。上面的示例,我输入了一个ls命令,然后输入logout。最后还调用了一个 close() 函数,其实没有用,logout命令输入后,整个telnet连接就中断了。如果不输入logout命令(没有interact的时候),我们就要使用 close() 函数。最好的方式是,无论什么情况,最后都调用 close() 函数。
下面再来一个示例:
这段代码,我使用了 open() 函数,这时另一种连接方式。在interact之前,还调用了 set_debuglevel() 函数,这个函数默认的参数时0,以上代码使用的是1,就将交互过程的信息都打印出来了。可以看到来回交互的都是byte stream。最后,使用 exit 退出(exit退出的其实是telnet服务器打开的bash,bash一旦退出,telnet连接就自动中断)。
与telnet服务器自动化交互
自动化交互才是我们使用telnetlib模块的最主要的原因。
下面这段代码示例,功能是自动登录服务器,切换到根目录(/),并拿到根目录的ll -h命令的打印结果后,终端连接:
在创建Telnet对象的时候连接服务器,然后一路都是 read_until() 和 write() 函数,这个过程就是在进行自动化交互。read_until() 函数还有一个timeout参数,以防止死等,超时后,如果telnet连接没有中断,就没有异常,只是将所有队列中的数据全部读出来:
以上代码,一直在 read_until 函数中使用一个错误的字符串,所有函数从来都等不到它想要的,只能等到超时,然后读取所有能读到的内容。
除了 read_until 函数,还有一个 read_all() 函数,我们在下面的示例代码中体会它的用法:
以上代码换了一中对write参数的写法,使用了字符串对象的encode函数。在输入密码登录后,连续输入了两个shell命令,ls和logout,然后通过 read_all() 函数,一把全部读出来。注意:读出来的这一大堆字符串里面,没有我们输入的命令字符串。
关于telnetlib模块的使用,本文的内容应该基本够用了。不过还有一些read_*函数,还有一个expect函数可以通过正则表达式来判断字符串是否是需要的,这些内容,请参考Python官方的说明:https://docs.python.org/3/library/telnetlib.html
-- EOF --