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

Gui*_*GWR 5 python ssh subprocess python-3.x

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

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

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

非常感谢!

Mat*_*ory 5

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

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

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

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

如果您有很多命令并且担心可能会超出命令行限制,您可以使用远程服务器上的选项执行sh(或bash)-s,该选项将在您发送命令时一一执行:

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()
Run Code Online (Sandbox Code Playgroud)

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

我觉得这对于大多数简单的情况来说有点矫枉过正,尽管最初的建议是最简单的。