将此处文档与 pxssh (pexpect) 一起使用
Use a here-document with pxssh (pexpect)
在我的 python 脚本中,我需要通过 SSH 执行一个命令,该命令也将 heredoc 作为参数。该命令调用交互式脚本,也可以调用如下:
dbscontrol << EOI
HELP
QUIT
EOI
我还发现 描述了如何使用 subprocess
进行操作,但我真的很喜欢 pexpect.pxssh
方便。
代码示例将不胜感激
我没有方便的方法来测试我对你问题的回答,但我有一个建议应该有效,如果没有,至少可以让你更接近。
考虑这个命令:
$ ssh oak 'ftp << EOF
lpwd
quit
EOF'
Local directory: /home/jklowden
$
这是怎么回事?整个带引号的字符串作为单个参数传递给 ssh,在远程服务器上它是 "executed"。虽然 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。
在我的 python 脚本中,我需要通过 SSH 执行一个命令,该命令也将 heredoc 作为参数。该命令调用交互式脚本,也可以调用如下:
dbscontrol << EOI
HELP
QUIT
EOI
我还发现 subprocess
进行操作,但我真的很喜欢 pexpect.pxssh
方便。
代码示例将不胜感激
我没有方便的方法来测试我对你问题的回答,但我有一个建议应该有效,如果没有,至少可以让你更接近。
考虑这个命令:
$ ssh oak 'ftp << EOF
lpwd
quit
EOF'
Local directory: /home/jklowden
$
这是怎么回事?整个带引号的字符串作为单个参数传递给 ssh,在远程服务器上它是 "executed"。虽然 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。