telnetlib 模块提供一个实现Telnet协议的类 Telnet。
Telnet 表示到 Telnet 服务器的连接. 实例初始化后默认不连接;必须使用 open() 方法来建立连接。或者, 可选参数 host 和 port 也可以传递给构造函数,在这种情况下,服务器的连接将在构造函数返回前建立。可选参数 timeout 为阻塞操作(如连接尝试)指定一个以秒为单位的超时时间(如果没有指定,将使用全局默认设置) 。
整理了一个实例,代码如下所示:
import telnetlib
import time
import logging
if __name__ == '__main__':
host_ip = '192.168.198.23'
command = 'dis version'
username = input("Enter your remote account: ")
password = input("Enter your Password: ")
tn = telnetlib.Telnet()
tn.open(host_ip, port=23)
tn.read_until(b'login: ', timeout=10)
tn.write(username.encode('ascii') + b'\n')
tn.read_until(b'Password: ', timeout=10)
tn.write(password.encode('ascii') + b'\n')
time.sleep(2) # 延时两秒再收取返回结果,给服务端一定的响应时间
str_command = tn.read_very_eager().decode('ascii')
if 'Login incorrect' not in str_command:
logging.warning('%s登录成功'%host_ip)
else:
logging.warning('%s登录失败,用户名或密码错误'%host_ip)
tn.write(command.encode('ascii') + b'\n')
time.sleep(2)
str_command = tn.read_very_eager().decode('ascii') #得到命令结果
logging.warning('命令执行结果:\n%s' % str_command )
执行后的结果如下图所示:
备注1:
Telnet 对象
Telnet 实例有以下几种常用方法:
Telnet.read_until(expected, timeout=None)
读取直到遇到给定字节串 expected 或 timeout 秒已经过去。
当没有找到匹配时,返回可用的内容,也可能返回空字节。如果连接已关闭且没有可用的数据,将触发 EOFError。
Telnet.read_all()
读取数据,直到遇到 EOF;连接关闭前都会保持阻塞。
Telnet.read_some()
在达到 EOF 前,读取至少一个字节的数据。如果命中 EOF,返回 b''。如果没有可用的数据,则阻塞。
Telnet.read_very_eager()
在不阻塞 I/O 的情况下读取所有的内容(eager)。
如果连接已关闭并且没有可用的数据,将会触发 EOFError 。如果没有熟数据可用返回 b'' 。除非在一个 IAC 序列的中间,否则不要进行阻塞。
Telnet.read_eager()
读取现成的数据。
如果连接已关闭并且没有可用的数悉数据,将会触发 EOFError 。如果没有熟数据可用返回 b'' 。除非在一个 IAC 序列的中间,否则不要进行阻塞。
Telnet.open(host, port=0[, timeout])
连接主机。第二个可选参数是端口号,默认为标准 Telnet 端口(23)。可选参数 timeout 指定一个以秒为单位的超时时间用于像连接尝试这样的阻塞操作(如果没有指定,将使用全局默认超时设置)。
不要尝试重新打开一个已经连接的实例。
触发 auditing event telnetlib.Telnet.open ,参数为 self,host,port。
Telnet.close()
关闭连接对象。
Telnet.write(buffer)
向套接字写入一个字节字符串,将所有 IAC 字符加倍。如果连接被阻塞,这可能也会阻塞。如果连接关闭可能会触发 OSError。
触发 auditing event telnetlib.Telnet.write ,参数为 self,buffer。
备注2:在windows下面输入telnet不是内部或外部命令的解决方案
解决方案:
现在就可以用telnet功能了