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

dbscontrol << EOI
HELP
QUIT
EOI

我还发现this Q&A描述了如何使用subprocess来做到这一点,但我真的很喜欢pexpect.pxssh的便利性。
代码示例将不胜感激

最佳答案

我没什么好期待的方法来测试我对您问题的回答,但是我有一个建议应该起作用,如果没有,至少可以使您更接近。

考虑以下命令:

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

怎么了?整个引用的字符串作为单个参数传递给ssh,在ssh上它被“执行”。尽管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。

10-07 19:16
查看更多