【问题标题】:How to execute a process remotely using python如何使用python远程执行进程
【发布时间】:2010-10-31 02:57:12
【问题描述】:

我想使用 Python 连接到远程服务器并在远程服务器上执行一个进程。我希望能够获得进程的返回码和标准错误(如果有的话)。以前有没有人做过这样的事情。我已经使用 ssh 完成了,但我想从 Python 脚本中完成。

干杯。

【问题讨论】:

标签: python ssh


【解决方案1】:

嗯,你可以从 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]

【讨论】:

  • 您需要确保对远程主机具有基于密钥的身份验证以及正确的密钥。否则,系统会提示您输入密码。
  • 很好,显然我已经过时了 - 本来打算推荐 os.spawnlp,但我看到引入了 subprocess 模块来替换它。
  • 谢谢老兄。当您通过 ssh 执行命令时,如果 ssh 本身没有任何问题,则返回代码和标准错误是执行命令的代码。我可以使用 popen 类和communicate() 方法从那里利用它。
  • 使用ssh module 而不是调用subprocess。即使在发布此答案时,也存在 ssh 模块的旧版本(称为 Paramiko)。
  • 最好使用 Fabric 或 paramiko,如以下答案中所述。 Fabric 是比 paramiko 更高级别的接口。
【解决方案2】:

使用为此目的创建的ssh module called 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 功能的最新模块。

【讨论】:

    【解决方案3】:

    如果你想封装 ssh 调用的具体细节,你可以使用Fabric 这个库面向部署和服务器管理,但它也可以用于解决这类问题。

    还可以查看Celery。这在各种代理上实现了 Python/Django 的任务队列。也许对您的问题来说有点过头了,但是如果您要在多台机器上调用更多功能,它将为您节省很多管理连接的麻烦。

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 2023-03-10
      • 2017-04-17
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      相关资源
      最近更新 更多