使用 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)
])
如果您希望每个命令仅在前一个命令成功时执行,您也可以在 &&
上加入命令。
如果你有很多命令并且你担心你可能会超过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")
),然后再将其写入 subprocess
的 stdin
。
尽管最初的建议是最简单的,但我觉得这对于大多数简单的情况来说都是多余的。
【讨论】:
不知道-s
和sh
的选项,因为我有大量的命令要执行,为了安全起见,我会尝试你提出的第二种方法。谢谢!
不确定sh -s
是否必要;我试过了,但它似乎仍然有效。以上是关于使用 Python 子进程的 ssh 多个命令的主要内容,如果未能解决你的问题,请参考以下文章