其他帖子涉及该主题,但我仍不清楚其原因:
window object
这并不起作用:
command = "echo /sbin/poweroff | ssh admin@" + address
shutcmd = subprocess.Popen(command, stdout = subprocess.PIPE, shell=True)
你会如何正确地做到这一点?
答案 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)