【问题标题】:Use a here-document with pxssh (pexpect)使用带有 pxssh 的 here-document (pexpect)
【发布时间】:2016-12-22 04:13:02
【问题描述】:

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

dbscontrol << EOI
HELP
QUIT
EOI

我还发现 this Q&A 描述了如何使用 subprocess 进行操作,但我真的很喜欢 pexpect.pxssh 的便利性。 代码示例将不胜感激

【问题讨论】:

    标签: python ssh pexpect heredoc pxssh


    【解决方案1】:

    我没有方便的方法来测试我对您问题的回答,但我有一个应该可行的建议,如果不行,至少可以让您更接近。

    考虑这个命令:

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

    发生了什么?整个带引号的字符串作为单个参数传递给 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) 的 5 分钟会告诉你发生了什么,你可以开始指手画脚了。 ;-)

    HTH。

    【讨论】:

    • 有道理。我实际上最终使用了subprocess.Popen,但语法几乎相同。感谢并享受赏金(很快)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2019-02-26
    • 2017-04-17
    相关资源
    最近更新 更多