如何在Windows下用Python的telnetlib实现telnetlib3相同效果?
问题:telnetlib无法获取Telnet服务欢迎消息的解决办法
我使用telnetlib3的Python代码可以在Linux和Windows系统中正常连接Telnet服务,并获取预期的欢迎输出:
import asyncio import telnetlib3 async def foo(): reader, writer = await telnetlib3.open_connection("192.168.200.10", 9000) data = await asyncio.wait_for(reader.read(4096), timeout=2) print(data) asyncio.run(foo())
预期输出:
Terminal emulator detected (unknown), switching to interactive shell Debug server connected. Waiting for commands (or 'exit')... Supported client terminals: telnet, screen, PuTTY. prompt >>
但改用telnetlib编写代码时,在Linux和Windows系统中仅能得到输出b'\x1b[0G\x1b[0G',代码如下:
import time import telnetlib session = telnetlib.Telnet("192.168.200.10", 9000, 2) received = b"" t0 = time.time() while time.time() - t0 < 2: data = session.read_very_eager() if data: received += data t0 = time.time() print(received)
需要修改上述telnetlib代码,使其在Windows系统下也能获取到完整的交互式欢迎消息。
解决思路与修改方案
问题根源在于telnetlib默认不会自动处理Telnet协议的选项协商,而目标Telnet服务需要客户端完成终端类型协商后,才会返回完整的欢迎消息。telnetlib3内部自动处理了这些协商流程,因此能正常获取内容。
方案一:手动处理终端类型协商
通过模拟标准Telnet客户端的协商行为,向服务端发送终端类型信息,触发服务端返回完整内容:
import telnetlib import time session = telnetlib.Telnet("192.168.200.10", 9000, 2) # 发送Telnet协商命令:请求协商终端类型(DO TERMINAL TYPE) session.write(b'\xff\xfd\x18') time.sleep(0.1) # 回复终端类型为vt100(SB TERMINAL TYPE + IS + 终端类型 + SE) session.write(b'\xff\xfa\x18\x00vt100\xff\xf0') received = b"" t0 = time.time() while time.time() - t0 < 2: data = session.read_very_eager() if data: received += data t0 = time.time() # 按服务端编码解码为字符串(此处假设为utf-8) print(received.decode('utf-8'))
方案二:直接等待服务端提示符
如果已知服务端最终输出的提示符(如示例中的prompt >>),可以直接使用read_until方法等待该提示符,跳过手动协商的步骤,实现更简洁可靠的获取:
import telnetlib session = telnetlib.Telnet("192.168.200.10", 9000, 2) # 等待直到出现目标提示符,超时时间设为2秒 result = session.read_until(b'prompt >>', timeout=2) # 解码为字符串输出 print(result.decode('utf-8'))
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

