在我的python脚本中,我需要通过SSH执行命令,该命令也将heredoc作为参数。该命令调用一个交互式脚本,该脚本也可以按如下方式调用:
dbscontrol << EOI
HELP
QUIT
EOI
我还发现this Q&A描述了如何使用subprocess
进行操作,但我非常喜欢pexpect.pxssh
方便。
代码示例将非常感谢
答案 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。