【python】telnetlib--Telnet客户端使用实践
- ▲写在前面
- ▲telnetlib库介绍
- 1)特性
- 2)安装方法
- ▲使用方法
- 1)实例化Telnet
- 2)建立telnet连接
- 3)发送指令
- 4)查看返回值
- 5)退出telnet连接
- ▲常用函数的其他使用方式
- 1)open函数
- 2)read函数
- 3)write函数
- ▲使用场景
- 1)登陆场景
- 2)执行后获取返回结果
▲写在前面
最近因为项目原因,学习了下telnetlib模块中的Telnet的使用方法,记录一下。
一些题外话:socket套接字中的流式套接字可以提供可靠的、面向连接的通信流。Telnet就是一个流式连接。
▲telnetlib库介绍
1)特性
Telnet 表示到 Telnet 服务器的连接. 实例初始化后默认不连接;必须使用 open() 方法来建立连接。或者, 可选参数 host 和 port 也可以传递给构造函数,在这种情况下,到服务器的连接将在构造函数返回前建立。可选参数 timeout 为阻塞操作(如连接尝试)指定一个以秒为单位的超时时间(如果没有指定,将使用全局默认设置) 。
不要重新打开一个已经连接的实例。
2)安装方法
pip install telnetlib
▲使用方法
1)实例化Telnet
def __init__(self):
self.tn = telnetlib.Telnet()
self.count = 0
2)建立telnet连接
self.tn.open(host_ip, port)
3)发送指令
这里发送命令需要先使用ascii编码
self.tn.write(command.encode('ascii') + b'\n')
4)查看返回值
self.tn.read_all()
5)退出telnet连接
self.tn.close()
或者
self.tn.write(b"exit\n")
▲常用函数的其他使用方式
1)open函数
看源码可知,open有三个参数值,分别是host,port,timeout。
其中timeout=socket._GLOBAL_DEFAULT_TIMEOUT 中的_GLOBAL_DEFAULT_TIMEOUT默认值为object()
- host:目标ip
- port:目标端口
- timeout:设置超时等待时间
2)read函数
以下的示例由于项目原因都使用了decode,不需要请自行去掉~
- read_until()
找到指定字符串后返回,或 超时返回。
read_until(word, 30).decode('ascii')
- read_very_eager()
返回的是上次获取之后本次获取之前的所有输出。
「有个问题是,缓存中的数据没办法返回」
read_very_eager().decode('ascii')
3)write函数
write(b"exit\n")
▲使用场景
1)登陆场景
- 支持异常重试
– 使用retry方法,通过stop_max_attempt_number指定异常次数 - 支持返回连接异常
- 支持返回登陆异常
@retry(stop_max_attempt_number=5)
def login_host(self, host_ip, port):
try:
# self.tn = telnetlib.Telnet(host_ip,port=23)
self.tn.open(host_ip, port)
except:
logging.warning('%s网络连接失败,请确认ip、port' % host_ip)
return False
time.sleep(1)
# 获取登录结果
# read_very_eager()获取到的是上次获取之后本次获取之前的所有输出
command_result = self.tn.read_very_eager().decode('ascii')
if 'Welcome to XXX' in command_result:
logging.info('%s登录成功' % host_ip)
return True
else:
logging.warning('%s登录失败' % host_ip)
raise Exception('登陆失败,正在尝试重连...')
2)执行后获取返回结果
def execute_command(self, command):
# 执行命令
self.tn.write(command.encode('ascii') + b'\n')
time.sleep(1)
# 获取命令结果
command_result = self.tn.read_very_eager().decode('ascii')
logging.info('命令执行结果:\n%s' % command_result)
return command_result