gpt4 book ai didi

python - 在 reactor.run() 之后向扭曲的 ssh 提供命令的合理方法

转载 作者:太空宇宙 更新时间:2023-11-03 15:28:32 25 4
gpt4 key购买 nike

伙计们,这是一个关于 python twisted ssh lib 的问题。

我看到的所有基于twisted.conch.ssh 充当ssh 客户端的示例代码甚至生产代码都是以这种模式与服务器交互:

  • 准备一些远程运行的命令;
  • 定义回调;
  • 启动 reactor 然后暂停以获取新的反馈;

在 reactor.run() 之后,我再也没有发现有人试图向 sshd 发送命令,脚本只是让他们等待。我认为可以 fork 或生成东西来发送命令。然而,由于 twisted 的优势之一是它的多路分解机制,因此它在作为服务器运行时不必 fork 来处理传入的请求。我可以说不 fork (作为客户端脚本)不断向服务器发送请求是合理的要求吗?

有什么想法吗?

TIA。

最佳答案

joefis 的回答基本上是正确的,但我敢打赌一些例子会有所帮助。首先,有几种方法可以让一些代码在 react 器启动后立即运行。

这个非常简单:

def f():
print "the reactor is running now"

reactor.callWhenRunning(f)

另一种方法是使用定时事件,尽管可能没有理由用这种方式而不是使用 callWhenRunning:

reactor.callLater(0, f)

您还可以使用 callWhenRunning 实现的底层 API:

reactor.addSystemEventTrigger('after', 'startup', f)

您还可以使用服务。这有点复杂,因为它涉及使用 twistd(1)(或其他将服务系统连接到 react 堆的东西)。但是你可以这样写一个类:

from twisted.application.service import Service

class ThingDoer(Service):
def startService(self):
print "The reactor is running now."

然后像这样写一个.tac文件:

from twisted.application.service import Application

from thatmodule import ThingDoer

application = Application("Do Things")
ThingDoer().setServiceParent(application)

最后,您可以使用 twistd(1) 运行此 .tac 文件:

$ twistd -ny thatfile.tac

当然,这只是告诉您在 react 堆运行后如何做一件事,这并不是您要问的。但是,这是相同的想法 - 您定义了一些事件处理程序并要求通过调用该处理程序来接收事件;当它被调用时,你可以做一些事情。同样的想法适用于您对海螺所做的任何事情。

你可以在 Conch examples 中看到这个,例如在 sshsimpleclient.py 中我们有:

class CatChannel(channel.SSHChannel):
name = 'session'

def openFailed(self, reason):
print 'echo failed', reason

def channelOpen(self, ignoredData):
self.data = ''
d = self.conn.sendRequest(self, 'exec', common.NS('cat'), wantReply = 1)
d.addCallback(self._cbRequest)

def _cbRequest(self, ignored):
self.write('hello conch\n')
self.conn.sendEOF(self)

def dataReceived(self, data):
self.data += data

def closed(self):
print 'got data from cat: %s' % repr(self.data)
self.loseConnection()
reactor.stop()

在此示例中,channelOpen 是打开新 channel 时调用的事件处理程序。它向服务器发送请求。它返回一个 Deferred,它附加了一个回调。该回调是一个事件处理程序,它将在请求成功时调用(在本例中,当 cat 已被执行时)。 _cbRequest 是它附加的回调,该方法执行下一步 - 将一些字节写入 channel 然后关闭它。然后是 dataReceived 事件处理程序,当通过 channel 接收字节时调用它,还有 closed 事件处理程序,当 channel 关闭时调用。

所以你可以在这里看到四个不同的事件处理程序,其中一些是开始操作,最终会触发后面的事件处理程序。

所以回到你关于做一件又一件事情的问题,如果你想打开两个猫 channel ,一个接一个,然后在 closed 事件处理程序中可以打开一个新 channel (而不是像本例中那样停止 react 器。

关于python - 在 reactor.run() 之后向扭曲的 ssh 提供命令的合理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3102098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com