【问题标题】:shell script remote execution using python使用python远程执行shell脚本
【发布时间】:2010-09-23 17:41:13
【问题描述】:

有没有一种方法可以在 Windows 上使用 Python 来执行位于远程 Unix 机器上的 shell 脚本?

P.S: 抱歉编辑晚了。我确实知道 Paramiko,但我想知道没有它是否有办法做到这一点。对于初学者,可以用 subprocess() 来完成吗?

【问题讨论】:

  • Remote server command execute 的可能重复项
  • 标准 Python 库中的任何内容都不允许您在 Unix 机器上进行远程执行。您必须使用 SSH 或编写自己的服务器(不要)。如果您不想使用 Paramiko,Twisted 提供了另一种 SSH 实现。不过,无论哪种方式,您都需要使用第三方软件包。
  • 你可以避开帕拉米科。正如 Rakis 所建议的,您可以探索 Twisted 中的 ssh 支持。您可以添加证书以避免密码挑战,并且在子进程中,您可以运行常用命令 ssh user@servername 然后后续命令将在服务器上执行。
  • @S. Lott - 你是“Building Skills in Python”一书的作者吗?
  • @Rakis - 你试过 Python 中的 subprocess 包吗?

标签: python unix shell


【解决方案1】:

您需要通过 ssh 连接到远程计算机,如果您有适当的凭据,则可以调用 shell 脚本。

对于使用 ssh,您可以轻松使用提供 ssh 自动化的 paramiko 模块

一个典型的例子:

import paramiko
import sys
import os
import os.path
passwd = ""
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('servername', username, password=passwd)
stdin, stdout, stderr = ssh.exec_command('df -h')
x = stdout.readlines()
print x
for line in x:
    print line
ssh.close()

用你的 shell 脚本替换“df -h”命令。

【讨论】:

    【解决方案2】:

    python 中没有用于远程执行 shell 的任何“包含电池”模块。我建议研究 Fabric ,它为在远程机器上通过 SSH 工作提供了一个非常好的界面,可能比 paramiko 好一点。你甚至可以在 windows 上安装 Fabric...

    【讨论】:

      【解决方案3】:

      我有一个未测试但应该基于文档工作的多处理和子进程...

      服务器:

      import subprocess
      from multiprocessing.managers import BaseManager
      def get_subprocess_module():
          return subprocess
      class MyManager(BaseManager):
          pass
      MyManager.register( 'subprocess', get_subprocess_module )
      MyManager(address=('', 50000), authkey='makecrazy').get_server().serve_forever()
      

      远程客户端:

      from multiprocessing.managers import BaseManager
      class MyManager(BaseManager):
          pass
      MyManager.register('subprocess')
      manager = MyManager(address=('dns.of.remote.server',50000),authkey='makecrazy')
      manager.connect()
      remoteSubprocess = manager.subprocess()
      rc = remoteSubprocess.call(['ls', '-aplh'])
      

      【讨论】:

        【解决方案4】:

        当然,通常通过 Python 支持的 ssh 协议(用于“安全 shell”),例如通过paramiko 第三方扩展。

        【讨论】:

          【解决方案5】:

          我会用 PexpectPlink 来做这个。

          【讨论】:

            【解决方案6】:

            您要么需要在远程机器上运行某种服务器,要么 ssh 进入并自己做。使用众多预先编写的 Python 服务器之一来监听客户端并启动 shell 脚本并不难。

            身份验证对您来说可能是也可能不是问题;请注意,其他任何人都可以按照您所做的相同步骤进行操作,并可能得到相同的结果。您不想让 intarwubs 上的任何人启动您的脚本!

            【讨论】:

              【解决方案7】:

              如果您不想使用 paramiko,请尝试 telnetlib。您可以使用它来执行远程命令。

              【讨论】:

                最近更新 更多