telnetlib
模块提供了一个Telnet
实现 Telnet
协议的类,凡是实现了 Telnet
协议的设都可以使用 telnetlib
进行登录。
通过 telnetlib
基础功能将其封装为类。
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import time
import telnetlib
class TelnetLib(object):
def __init__(self):
self.tn = None
self.EXIT = b'quit\n'
self.LOGIN = b'Login'
self.USERNAME = b'Username:'
self.PASSWORD = b'Password:'
@staticmethod
def format(data):
return data.encode('UTF-8') + b'\n'
def link(self, host, port=23, timeout=3):
# 连接设备
self.tn = telnetlib.Telnet(host, port, timeout)
def login(self, username, password):
# 监听登录事件
self.tn.read_until(self.LOGIN)
# 监听输入账户事件
self.tn.read_until(self.USERNAME)
# 输入账户
self.tn.write(self.format(username))
# 监听输入密码事件
self.tn.read_until(self.PASSWORD)
# 输入密码
self.tn.write(self.format(password))
def shell(self, command):
# 执行命令
self.tn.write(self.format(command))
# 延时0.5s
time.sleep(1)
# 在I/O不阻塞的情况下读取所有数据,否则返回空
data = self.tn.read_very_eager()
# 解码后返回数据
return data.decode('UTF-8')
def __del__(self):
# 退出设备
self.tn.write(self.EXIT)
# 关闭连接
self.tn.close()
if __name__ == '__main__':
tl = TelnetLib()
tl.link(host='127.0.0.1', port=23, timeout=3)
tl.login(username='admin', password='***')
return_value = tl.shell(command='display ip routing-table')
print(return_value)
Telnet 实例具有以下方法:
直到阅读到给定的字符串返回,或者超时返回。如果找不到匹配项,则返回可用的任何项,可能为空字符串。
Telnet.read_until(expected[, timeout])
读取所有数据直到EOF。
Telnet.read_all()
至少读取一个字节的熟数据。
Telnet.read_some()
读取所有熟数据。
Telnet.read_very_eager()
随时读取可用的数据。
Telnet.read_eager()
处理并返回队列中已有的数据。
Telnet.read_lazy()
返回已熟练队列中的任何数据。
Telnet.read_very_lazy()
返回SB / SE对之间收集的数据。
Telnet.read_sb_data()