如何使用Python远程执行进程

30
我想使用Python连接到远程服务器并执行进程,同时获取进程的返回代码和stderr(如果有)。之前有人做过类似的事情吗?我已经通过ssh实现了这一点,但我想从Python脚本中实现。祝好。

1
重复的问题:https://dev59.com/L0bRa4cB1Zd3GeqP1IZ9 - S.Lott
这是一个由微软收购后开源的项目,遵循微软许可证。它在Linux上运行良好。 - user1277476
3个回答

43

使用专门为此创建的ssh模块paramiko,而不是使用subprocess。以下是一个示例:

from paramiko import SSHClient
client = SSHClient()
client.load_system_host_keys()
client.connect("hostname", username="user")
stdin, stdout, stderr = client.exec_command('program')
print "stderr: ", stderr.readlines()
print "pwd: ", stdout.readlines()

更新:该示例曾使用 ssh 模块,但现已弃用,paramiko 是提供 Python 中 SSH 功能的最新模块。


27

好的,你可以从Python中调用ssh...

import subprocess
ret = subprocess.call(["ssh", "user@host", "program"]);

# or, with stderr:
prog = subprocess.Popen(["ssh", "user@host", "program"], stderr=subprocess.PIPE)
errdata = prog.communicate()[1]

7
请确保您具备针对远程主机的基于密钥的身份验证,并拥有相应的密钥。否则,系统会提示您输入密码。 - slacy
很好,显然我已经过时了 - 我本来想推荐os.spawnlp,但我看到subprocess模块被引入来替代它。 - klochner
谢谢,当你通过ssh执行一个命令时,如果ssh本身没有任何问题,返回码和stderr就是被执行的命令的。我可以使用popen类和communicate()方法从那里进入。 - stinkypyper
1
使用ssh模块代替调用subprocess。即使在回答发布时,ssh模块的早期版本(称为Paramiko)也已存在。 - aculich
最好使用以下答案中详细介绍的Fabric或paramiko。 Fabric比paramiko更高级别的接口。 - Craig S. Anderson

5
也许如果您想包装ssh调用的实质,可以使用Fabric。这个库专注于部署和服务器管理,但它也可以对这些问题很有用。
另外,请看一下Celery。它在各种代理上为Python/Django实现了任务队列。也许对于您的问题来说有点过度,但如果您要在多台机器上调用更多函数,它将节省您大量管理连接的麻烦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接