Linux服务器Python SSH记录文本含冗余字符问题求助
解决SSH会话记录中的ANSI控制序列冗余问题
你看到的[4;48H这类字符是ANSI终端控制序列,用于控制终端光标移动、颜色输出、屏幕清刷等操作。cat命令会解析并执行这些序列,所以显示效果正常,但文本编辑器会将其当作普通文本直接展示,导致出现冗余内容。
下面是两种可行的解决方法:
方法1:写入文件前过滤ANSI序列
修改你的writeToFile函数,在写入前先清除数据中的ANSI控制序列。可以用正则表达式实现过滤:
import re import logging # 匹配常见ANSI转义序列的正则 ANSI_ESCAPE_REGEX = re.compile(r'\x1B(?:[@-Z\\-_]|\[.*?[a-zA-Z])') async def writeToFile(filename, data): try: # 过滤ANSI控制序列 cleaned_data = ANSI_ESCAPE_REGEX.sub('', data) path = f'{RECORDINGS_PATH}/{filename}' # 用with语句自动管理文件句柄,避免遗漏关闭 with open(path, "a") as f: f.write(cleaned_data) except Exception as e: logging.exception(f'error writing to recordings file')
这个正则能匹配绝大多数常见的ANSI转义序列,过滤后文件仅保留纯文本内容,文本编辑器打开即可正常显示。
方法2:后处理已生成的记录文件
如果不想修改代码,也可以用Linux工具清理已有的记录文件:
- 使用
sed命令(无需额外安装):
sed -i 's/\x1B\[[0-9;]*[a-zA-Z]//g' /path/to/your/record/file
- 使用
ansifilter工具(需先安装,如apt install ansifilter):
ansifilter -i /path/to/original/file -o /path/to/cleaned/file
额外优化提示
- 替换手动
f.close()为with语句,能更安全地管理文件资源,避免因异常导致文件未正常关闭。 - 如果需要保留部分终端格式(如颜色),可以考虑将ANSI序列转换为Markdown格式,但这需要更复杂的逻辑,纯文本记录场景一般不需要。
内容的提问来源于stack exchange,提问作者Zag Gol
相关产品推荐
相关产品推荐

