使用expect从ssh获取输出

时间:2016-10-21 16:43:33

标签: python ssh expect

我正在尝试使用expect将任务自动化为更大的python程序的一部分,并且在远程计算机上运行ssh命令的stdout时遇到很多麻烦。我之前没有使用expect,并且未能在手册页上找到解决方案。

我需要使用expect在实际运行此命令之前自动执行某些交互,但我在此处将其删除以简化问题。

以下是该计划的简化示例:

import subprocess

expect = """
/usr/bin/expect <<EOF

spawn ssh some_machine ls
expect eof
puts "$expect_out(buffer)"
"""

output = subprocess.check_output(expect, shell=True)
print(output)

输出:

b'spawn ssh some_machine ls\r\n116029\r\nArchive\r\n\r\n(buffer)\n'

它似乎包含spawn命令以及&#34;(缓冲区)&#34;在末尾。我不确定为什么会这样。我想尝试只获取ls的结果。

如果我在期望中启用调试模式,我会看到expect_out(buffer)被设置为我想要返回的内容,但puts并未反映此内容。

输出:

expect version 5.45
argv[0] = /usr/bin/expect  argv[1] = -d
set argc 0
set argv0 "/usr/bin/expect"
set argv ""
executing commands from command file
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {1753}
expect: read eof
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "116029\r\nArchive\r\n"
<wrong output as above>

1 个答案:

答案 0 :(得分:1)

您可以使用log_user命令抑制期望的日志输出:

log_user 0
spawn ssh some_host ls
expect eof
puts "$expect_out(buffer)"

没有log_user 0,我得到:

$ expect -f sample.tcl
spawn ssh some_host ls
file1
file2

通过添加log_user 0,我得到:

$ expect -f sample.tcl
file1
file2

当您通过stdin提供期望脚本时似乎有些奇怪,但以下似乎有效:

import subprocess
import tempfile

expect = """
log_user 0
spawn ssh some_host ls < /dev/null
expect eof
puts "$expect_out(buffer)"
"""

with tempfile.NamedTemporaryFile() as fd:
    fd.write(expect)
    fd.flush()
    fd.seek(0)
    output = subprocess.check_output(['expect', fd.name])

print(output)