我需要使用subprocess
模块在ssh会话中执行多个shell命令。
我可以一次执行一个命令:
subprocess.Popen(["ssh", "-o UserKnownHostsFile=/dev/null", "-o StrictHostKeyChecking=no", "%s" % <HOST>, <command>])
但是有没有办法在ssh会话中使用subprocess
执行多个shell命令?如果可能的话,我不想使用软件包。
非常感谢您!
答案 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}}。
在最初的建议最简单的情况下,我觉得这在大多数简单情况下都是多余的。