使用带有pxssh的here-document(pexpect)

时间:2016-08-15 22:13:03

标签: python ssh pexpect heredoc pxssh

在我的python脚本中,我需要通过SSH执行命令,该命令也将heredoc作为参数。该命令调用一个交互式脚本,该脚本也可以按如下方式调用:

dbscontrol << EOI
HELP
QUIT
EOI

我还发现this Q&A描述了如何使用subprocess进行操作,但我非常喜欢pexpect.pxssh方便。 代码示例将非常感谢

1 个答案:

答案 0 :(得分:1)

我没有方便地测试我对你问题的答案,但我有一个建议应该有效,如果没有,至少可以让你更接近。

考虑这个命令:

$ ssh oak 'ftp << EOF
lpwd
quit
EOF'
Local directory: /home/jklowden
$ 

发生了什么事?整个引用的字符串作为单个参数传递给ssh,在那里它被执行&#34;执行&#34;在遥控器上。虽然ssh并不清楚这意味着什么,但确切地说,我们知道 execv (2)的作用:如果 execve (2)无法执行其传递的参数, execv函数将使用相同的参数调用/bin/sh(在本例中,我们引用的字符串)。然后,shell将引用的字符串计算为单独的参数,检测HereDoc重定向,并按常规执行。

使用该信息,并快速查看pexpect.pxssh文档,看起来像你想要的那样:

s = pxssh.pxssh()
...
s.sendline('ftp << EOF\nlpwd\nquit\nEOF')

如果这不起作用,那么有些东西会破坏您的数据。用 strace (1)五分钟会告诉你发生了什么,你可以开始指责。 ; - )

HTH。