You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:07:36