正确使用subprocess.Popen通过SSH发出命令

时间:2015-05-26 13:46:57

标签: python ssh subprocess

其他帖子涉及该主题,但我仍不清楚其原因:

window object

这并不起作用:

command = "echo /sbin/poweroff | ssh admin@" + address
shutcmd = subprocess.Popen(command, stdout = subprocess.PIPE, shell=True)

你会如何正确地做到这一点?

2 个答案:

答案 0 :(得分:3)

因为|是shell语法和语义。

你可以通过这样做来模拟这个:

from subprocess import Popen, PIPE, STDOUT

user = "root"
host = "1.2.3.4"

p = Popen(
    ["ssh", "{}@{}".format(user, host)],
    stdin=PIPE, stdout=PIPE, stderr=STDOUT
)
stdout, stderr = p.communicate("/sbin/poweroff\n")

然而,将命令本身作为ssh的参数发出更简单:

p = Popen(
    ["ssh", "{}@{}".format(user, host), "/sbin/poweroff"],
)
p.wait()

撇开;您的第一个示例完全起作用的原因是shell=True。一个shell涉及运行你的“shell”,因此生成的新shell有自己的stdin,stdout和stderr的fd三元组;所以echo | ssh工作。

请参阅:Pipeline (UNIX)

答案 1 :(得分:1)

你可以通过命令运行到ssh,你不必管道。

尝试

shutcmd = subprocess.Popen(['ssh', 'admin@' + address, '/sbin/poweroff'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)