Python的Paramiko库在SSH连接到远程机器的CLI并获取输出时,是否有简单的方法可以去除垃圾值?

8

我正在使用Python的Paramiko库通过SSH连接远程机器,并从命令行获取一些输出。我看到了很多垃圾打印以及实际的输出。如何摆脱这些垃圾信息?

chan1.send("ls\n")
output = chan1.recv(1024).decode("utf-8")
print(output)
[u'Last login: Wed Oct 21 18:08:53 2015 from 172.16.200.77\r', u'\x1b[2J\x1b[1;1H[local]cli@BENU>enable', u'[local]cli@BENU#Configure',

我希望消除输出中的 [2J\x1b[1;1Hu。它们是无用的垃圾。

2个回答

11
这不是垃圾。这些是通常由终端客户端解释以美化输出的ANSI转义码
如果服务器配置正确,只有在使用交互式终端时才会出现这些情况,换句话说,如果您为会话请求了一个伪终端(如果您正在自动化会话,则不应该这样做)。
如果您使用了SSHClient.invoke_shell,Paramiko会自动请求伪终端,因为它被用于实现交互式终端。另请参阅如何在Python Paramiko中启动无终端仿真的shell?
如果你想自动执行远程命令,最好使用SSHClient.exec_command,默认情况下它不会分配伪终端(除非你通过get_pty=True参数进行覆盖)。
stdin, stdout, stderr = client.exec_command('ls')

另请参阅Paramiko中exec_command和invoke_shell()的区别是什么?
或者作为一种解决方法,参见如何在Python中删除字符串中的ANSI转义序列
虽然这只是一个权宜之计,可能不足以解决问题。您可能还会遇到其他与交互式终端有关的问题,而不仅仅是转义序列。
您可能对“最后登录”消息和命令提示符(cli@BENU>)不感兴趣。使用exec_command就不会出现这些情况。
如果由于服务器的某些特定要求或限制而需要使用“shell”通道,请注意,技术上可以在不使用伪终端的情况下使用“shell”通道。但是 Paramiko 的 SSHClient.invoke_shell 不允许这样做。相反,您可以手动创建“shell”通道。请参阅在不使用 Channel.exec_command() 的情况下,我可以在调用 Channel.get_pty() 之前调用 Channel.invoke_shell() 吗?
最后,u并不是实际字符串值的一部分(请注意它在引号外面)。它表示字符串值采用Unicode编码。你需要这个!

1
那解释了很多。谢谢。 - Rakesh Nittur

1
这实际上不是垃圾。字符串前面的u表示这是一个Unicode字符串。\x1b[2J\x1b[1;1H是转义序列。我不知道它确切的作用是什么,但当我打印它时,它似乎可以清除屏幕。
要了解我的意思,请尝试运行以下代码: for string in output: print string

我已经尝试过了。现在我得到了相同的输出,每个字母都垂直打印在屏幕上。我想解析输出,但如果我不摆脱这些不需要的东西,那就会变得困难。 - Rakesh Nittur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接