Python如何移除paramiko SSH输出中残留的\x1b[1B转义字符
问题原因
你看到的\x1b[1B是终端ANSI光标控制转义序列(作用是光标下移1行),不属于标准换行符,所以splitlines()方法不会自动识别处理这类字符。这类字符一般是因为你通过paramiko连接时分配了伪终端(PTY),终端交互过程中输出的光标控制、颜色渲染类控制码会和业务输出一起返回。
解决方案
方案1:通用正则清理(适配所有带ANSI转义符的输出场景)
用正则匹配所有ANSI转义序列批量移除,不需要针对单个转义符写死替换规则,后续碰到颜色、其他光标控制符也能一次性清理:
import re # 原始返回内容 raw_list = ['Total active sessions : 0\r\x1b[1BActive TCP sessions : 0\r\x1b[1BActive UDP sessions : 0\r\x1b[1BActive ICMP sessions : 0\r\x1b[1B'] # 预编译ANSI转义符匹配规则 ansi_pattern = re.compile(r'\x1b\[[0-9;]*[a-zA-Z]') clean_lines = [] for content in raw_list: # 先清除所有ANSI转义符 content_clean = ansi_pattern.sub('', content) # 拆分后过滤空行、首尾空白 for line in content_clean.splitlines(): stripped_line = line.strip() if stripped_line: clean_lines.append(stripped_line) print(clean_lines)
执行后输出结果:
['Total active sessions : 0', 'Active TCP sessions : 0', 'Active UDP sessions : 0', 'Active ICMP sessions : 0']
方案2:从paramiko调用源头避免转义符输出
如果你的命令不需要交互式终端执行,调用exec_command时不要开启get_pty=True参数(该参数默认值为False,手动开启才会分配伪终端),关闭后绝大多数防火墙、服务器返回的命令输出不会携带这类终端控制转义符,不需要额外做文本清理。
示例正确调用方式:
# 不要加get_pty=True stdin, stdout, stderr = ssh.exec_command("show session") output = stdout.read().decode()
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

