Pexpect - 静默SSH连接输出

5 投票
4 回答
4780 浏览
提问于 2025-04-16 04:25

我正在使用一个简单的pexpect脚本,通过ssh连接到远程机器,并获取一个命令返回的值。有没有什么方法可以让pexpect或者ssh忽略Unix的欢迎信息?也就是说,从

    child = pexpect.spawn('/usr/bin/ssh %s@%s' % (rem_user, host))
    child.expect('[pP]assword: ', timeout=5)
    child.sendline(spass)
    child.expect([pexpect.TIMEOUT, prompt])
    child.before = '0'
    child.sendline ('%s' % cmd2exec)
    child.expect([pexpect.EOF, prompt])

    # Collected data processing
    result = child.before
    # logon to the machine returns a lot of garbage, the returned executed command is at the 57th position
    print result.split('\r\n') [57]
    result = result.split('\r\n') [57]

我该如何简单地获取返回的值,忽略掉“上次成功登录”和“版权信息”等内容,而不需要担心这些信息在输出中的具体位置?

谢谢!

4 个回答

0

我使用了paramiko这个工具来自动化SSH连接,发现它非常好用。它可以处理连接时的问候信息,并且可以在后台静默执行命令。

4

如果这个命令不是需要和你互动的,你可以直接用 ssh HOST COMMAND 来执行这个命令,这样就不用经历登录时那些繁琐的步骤了。如果这个命令是需要互动的,你可以经常使用 ssh 的 -t 选项,也就是 ssh -t HOST COMMAND,这样可以强制分配一个伪终端,让远程的程序觉得它是在一个真实的终端上运行。

6

如果你能访问你要登录的服务器,可以试着在你的主目录下创建一个叫做 .hushlogin 的文件。这个文件的存在会让服务器在你登录时不显示常规的欢迎信息和类似的内容。

另外,你也可以试试 ssh -T 这个命令,它会完全禁用终端分配;这样你就不会看到命令行提示符,但你仍然可以输入命令并查看返回的结果。

ServerFault 上还有一个类似的讨论,可能对你有帮助。

撰写回答