使用Python远程执行Shell脚本

6
有没有办法在Windows上使用Python来执行位于远程Unix机器上的shell脚本?
附言:很抱歉编辑晚了。我知道Paramiko,但我想知道是否有一种方法可以不用它来完成。首先,能否使用subprocess()实现?

可能是[远程服务器命令执行]的重复问题(https://dev59.com/3E7Sa4cB1Zd3GeqP69fL)。 - S.Lott
1
标准的Python库中没有任何工具可以让你在Unix机器上进行远程执行。你必须使用SSH或编写自己的服务器(不建议)。如果你想避免使用Paramiko,Twisted提供了另一种SSH实现方式。但无论如何,你都需要使用第三方包。 - Rakis
你可以避免使用Paramiko。正如Rakis所建议的那样,你可以探索Twisted中的ssh支持。你可以添加证书,这样就可以避免密码挑战,在子进程中,你可以运行通常的命令ssh user@servername,然后随后的命令将在服务器上执行。 - pyfunc
@S. Lott - 你是《Python技能构建》的作者吗? - fixxxer
@Rakis - 你尝试过Python中的subprocess包吗? - fixxxer
7个回答

15
你需要通过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"命令。


3

在Python中,没有任何“一揽子”模块用于远程shell执行。我建议研究Fabric,它提供了一个非常好的界面,可以通过SSH在远程机器上工作,可能比paramiko更好用。您甚至可以在Windows上安装Fabric...


2

我有一个使用多进程和子进程的方案,虽然我没有测试过,但根据文档应该可以正常工作...

服务器:

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'])

1

当然,通常可以通过ssh协议(“安全外壳”)进行,例如通过paramiko第三方扩展来支持Python。


1

0

你需要在远程机器上运行某种类型的服务器,或者通过ssh登录并自己完成。使用许多预先编写的Python服务器之一来监听客户端并启动shell脚本并不困难。

身份验证可能对你构成问题,要注意的是,其他人可以按照你的步骤进行操作,并有可能获得相同的结果。你不想让任何人在互联网上启动你的脚本!


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

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