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 命令?如果可能,我不想使用包。
非常感谢!
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
我觉得这对于大多数简单的情况来说有点矫枉过正,尽管最初的建议是最简单的。