使用 Twisted 在远程系统上运行命令

Dou*_*oug 3 python twisted

我正在尝试使用 Twisted 编写客户端/服务器,该客户端/服务器将允许客户端在服务器上发出远程命令并实时接收响应数据。即如果我运行$> ssh server someProg.sh,我将“实时”看到结果,而不是在过程完成时立即看到结果。这种事情在 Twisted 中可能发生吗?谢谢。

Gly*_*yph 5

绝对地。正如评论中已经指出的,您可以通过使用 Twisted 的“conch”库直接连接到 SSH 服务器来完成此操作。这更具可扩展性(您可以打开大量连接而无需任何额外的进程)并且更可移植(它可以在 Windows 上工作),但它不会考虑您的 OpenSSH 配置,并且您必须编写一堆额外的代码来处理诸如主机密钥验证之类的事情。另一个问题也没有直接解决您的主要问题,即关于输出到达时正在处理的问题。

简单的答案是“是”,但这里有一个演示程序,它会生成几个子进程并显示它们的输出。您可以将其替换sys.executable为另一个要生成的程序(即ssh),它的工作方式完全相同。

import os, sys

from twisted.internet.protocol import ProcessProtocol
from twisted.internet import reactor
from twisted.internet.defer import Deferred, gatherResults

script = """
import time
for x in range(3):
    time.sleep(1)
    print(x)
"""

class SimpleProcess(ProcessProtocol):
    def __init__(self, id, d):
        self.id = id
        self.d = d
    def outReceived(self, out):
        print('Received output: {out} from: {proc}'
              .format(out=repr(out), proc=self.id))
    def processEnded(self, reason):
        self.d.callback(None)

ds = []
for x in range(3):
    d = Deferred()
    reactor.callLater(
        x * 0.5, reactor.spawnProcess, SimpleProcess(x, d),
        sys.executable, [sys.executable, '-u', '-c', script],
        os.environ)
    ds.append(d)

gatherResults(ds).addBoth(lambda ignored: reactor.stop())

reactor.run()
Run Code Online (Sandbox Code Playgroud)