Paramiko和“远程Python”

1 投票
2 回答
2384 浏览
提问于 2025-04-16 20:52

我想通过SSH连接来控制一个远程的Python解释器,并且希望能用Python自己来驱动它。

我有一个基本的模板:

ssh.connect(servername, serverport, username,  key_filename=key_filename)

transport = ssh.get_transport()
channel = transport.open_session()

channel.exec_command(PATH_TO_EXEC)

while True:
    r, w, e = select.select([channel], [], [], 1)
    if channel in r:
        try:
            if channel.recv_ready():
                x = channel.recv(64)
            elif channel.recv_stderr_ready():
                x = channel.recv_stderr(64)
            else:
                continue

            if len(x) == 0:
                print '\r\n*** EOF\r\n',
                break
            sys.stdout.write(x)
            sys.stdout.flush()
        except socket.timeout:
            pass

这个模板让我可以用pdb和远程应用进行交流,比如用channel.set("command\n")来发送命令。

这个方法在bashgdb上都能很好地工作,但我就是无法从python(版本2)获取输出流。

那么,Python是怎么处理它的输出流的呢?为什么我的代码在这里不管用呢?

2 个回答

2

根据你的目标,你可以选择以下两种方式(当然还有其他很多选择!)

如果你想通过 Python 来控制远程机器上的脚本执行,可以试试Fabric。在他们的网站上这样介绍:

Fabric 是一个 Python(2.5 或更高版本)库和命令行工具,旨在简化使用 SSH 进行应用部署或系统管理的过程。它提供了一系列基本操作,可以执行本地或远程的命令(通常是普通命令或通过 sudo),以及上传/下载文件的功能,还有一些辅助功能,比如提示用户输入或中止执行。

如果你想控制远程进程并将它们的输出整合到你主程序的流程中,可以使用multiprocessing 模块。根据PEP 371的介绍:

这个包还提供了服务器和客户端的功能(processing.Manager),可以实现对象和任务的远程共享和管理,这样应用程序不仅可以利用本地机器的多个核心,还可以在一组网络连接的机器上分配对象和任务。

2

除非你是在做学术研究,或者有特别的需求需要使用ssh,不然可以看看pushy这个工具。我自己没用过,但看起来挺成熟的。

撰写回答