使用 Python 子进程的 ssh 多个命令

Posted

技术标签:

【中文标题】使用 Python 子进程的 ssh 多个命令【英文标题】:Multiple commands with ssh using Python subprocess 【发布时间】:2018-12-09 05:55:35 【问题描述】:

我需要使用 subprocess 模块在 ssh 会话中执行多个 shell 命令。 我可以一次执行一个命令:

   subprocess.Popen(["ssh",  "-o UserKnownHostsFile=/dev/null", "-o StrictHostKeyChecking=no", "%s" % <HOST>, <command>])

但是有没有办法在 ssh 会话中使用 subprocess 执行多个 shell 命令?如果可能,我不想使用包。

非常感谢!

【问题讨论】:

对于多个命令,这可能有点过头了,但是你可以写出一个 shell 脚本,scp 它,远程运行它并收集带有返回码的输出。同样,这只对更复杂的逻辑和更多的命令才有意义。对于少数命令,只需用“&&”、“;”、“||”链接它们或其他任何有意义的东西 @Sergey ':' 和 '&&' 选项都在我的回答中进行了概述,以及远程使用标准输入与sh -s 来执行我认为更好的@987654325 版本@ 并运行方法。 【参考方案1】:

严格来说,无论您在远程服务器上执行多少命令,您都只执行一个带有Popen 的命令。该命令是ssh

要在远程服务器上执行多个命令,只需将它们传递到由;s 分隔的command 字符串中:

commands = ["echo 'hi'",  "echo 'another command'"]
subprocess.Popen([
    "ssh",
    "-o UserKnownHostsFile=/dev/null",
    "-o StrictHostKeyChecking=no",
    ";".join(commands)
])

如果您希望每个命令仅在前一个命令成功时执行,您也可以在 &amp;&amp; 上加入命令。

如果你有很多命令并且你担心你可能会超过command line limits,你可以在远程服务器上使用-s 选项执行sh(或bash),它会一个接一个地执行命令发送给他们:

p = subprocess.Popen([
    "ssh",
    "-o UserKnownHostsFile=/dev/null",
    "-o StrictHostKeyChecking=no",
    "sh -s",
], stdin=subprocess.PIPE)

for command in commands:
    p.stdin.write(command)
    p.stdin.write("\n")
    p.flush()

p.communicate()

请注意,在 Python3 中,您需要先将命令编码为字节字符串 (command.encode("utf8")),然后再将其写入 subprocessstdin

尽管最初的建议是最简单的,但我觉得这对于大多数简单的情况来说都是多余的。

【讨论】:

不知道-ssh 的选项,因为我有大量的命令要执行,为了安全起见,我会尝试你提出的第二种方法。谢谢! 不确定sh -s 是否必要;我试过了,但它似乎仍然有效。

以上是关于使用 Python 子进程的 ssh 多个命令的主要内容,如果未能解决你的问题,请参考以下文章

子进程子回溯

使用子进程从 python 执行时,ssh 未被识别为命令?

如何从 Python 中的子进程向 SSH 传递命令

使用supervisor进行进程管理

Supervisor进程管理

Linux学习-进程管理