Python telnetlib读取响应时出现异常转义字符问题求助
解决telnetlib读取响应时命令带大量转义字符的问题
问题分析
你遇到的\x1b开头的字符是ANSI终端控制序列,这是设备的Telnet服务在回显你发送的命令时,附带的终端格式控制码(比如光标移动、字符高亮等)。telnetlib会直接返回原始字节流,不会自动解析这些控制序列,所以命令部分看起来会有大量奇怪的转义字符,而其他响应内容因为没有格式控制所以显示正常。
解决方案
方案1:禁用设备的终端格式回显(推荐)
大部分网络设备支持通过命令关闭终端的控制字符输出,连接设备后先发送对应的配置命令,不同设备命令略有差异:
- 思科设备:发送
terminal type dumb或no terminal editing - 华为设备:发送
screen-length 0 temporary或undo terminal monitor - 通用尝试:
terminal no echo(部分设备有效)
示例代码:
# 连接后先发送禁用终端格式的命令 self.terminal.write(b'terminal type dumb\r\n') # 等待设备响应 self.terminal.read_until(b'#', self.telnetTimeout) # 再发送业务命令 self.terminal.write(b'config\r\n') telnetResponse = self.terminal.read_until(b'(Config)#', self.telnetTimeout)
方案2:客户端过滤ANSI控制序列
如果无法修改设备配置,就在Python中手动去掉响应里的ANSI转义字符,用正则表达式匹配并替换所有控制序列:
import re def strip_ansi_codes(raw_response): # 匹配所有ANSI终端控制序列的正则 ansi_pattern = re.compile(rb'\x1b(?:\[[0-9;]*[a-zA-Z]|[0-9a-zA-Z])') return ansi_pattern.sub(b'', raw_response) # 读取响应后处理 telnetResponse = self.terminal.read_until(b'(Config)#', self.telnetTimeout) clean_response = strip_ansi_codes(telnetResponse) # 解码为字符串查看 print(clean_response.decode('utf-8'))
验证效果
处理后的响应会去掉所有转义字符,还原为正常的命令回显+设备提示符,示例:
config mydevice(Config)#
内容的提问来源于stack exchange,提问作者BeRightBack
相关产品推荐
相关产品推荐

