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

时间:2018-06-30 04:59:44

标签: python python-3.x ssh subprocess

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

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

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

非常感谢您!

1 个答案:

答案 0 :(得分:2)

严格来说,无论您在远程服务器上执行多少命令,您都只能使用Popen执行一个命令。该命令为ssh

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

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

如果希望每个命令仅在上一个命令成功后才执行,则可以在&&上加入命令。

如果您有许多命令,并且担心自己可能超出command line limits,则可以在远程服务器上使用sh选项执行-s(或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")),然后再将其写入stdin的{​​{1}}。

在最初的建议最简单的情况下,我觉得这在大多数简单情况下都是多余的。