将命令馈送到twisted ssh之后反应器.运行()

2024-09-28 11:41:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所有示例代码,甚至我看到的作为ssh客户机的生产代码都基于扭曲的.conch.ssh都是以这样的模式与服务器交互:

  • 准备一些远程运行的命令
  • 定义回拨
  • 启动反应器,然后暂停进行新的反馈

在反应器.运行(),我从未发现有人试图向sshd发送命令,脚本只是等待。我想可以用叉子或产卵来发送命令。然而,由于twisted的一个优点是它的解复用机制,所以当作为服务器运行时,它不必分叉来处理传入的请求。我可以说,不分叉(作为客户端脚本)连续向服务器发送请求是合理的要求吗?在

有什么想法吗?在

蒂娅。在


Tags: 代码命令服务器脚本示例客户机远程定义
2条回答

约菲斯的回答基本上是正确的,但我打赌有些例子会有所帮助。首先,有几种方法可以在反应堆启动后立即运行一些代码。在

这个很简单:

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

reactor.callWhenRunning(f)

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

^{pr2}$

您还可以使用底层API,该API按以下方式实现callWhenRunning

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

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

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)

{tac>最后可以使用这个文件

$ twistd -ny thatfile.tac

当然,这只告诉你如何在反应堆运行后做一件事,这并不是你所要求的。不过,这是相同的想法——定义一些事件处理程序,并通过调用该处理程序来请求接收事件;当调用该处理程序时,您可以执行一些操作。同样的想法也适用于你用海螺做的任何事情。在

您可以在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是打开新通道时调用的事件处理程序。它向服务器发送一个请求。它返回一个Deferred,并附加一个回调。该回调是一个事件处理程序,当请求成功时(在本例中,当cat被执行时)将调用它。_cbRequest是它附加的回调函数,该方法采取下一步-向通道写入一些字节,然后关闭它。然后是dataReceived事件处理程序,当通过chnanel接收到字节时调用它,closed事件处理程序在通道关闭时调用。在

因此,您可以在这里看到四个不同的事件处理程序,其中一些正在启动操作,这些操作最终将触发后面的事件处理程序。在

因此,回到您关于一件接一件地做一件事的问题,如果您想打开两个cat通道,一个接一个,那么在closed事件处理程序中可以打开一个新通道(而不是像本例中那样停止反应器)。在

你想把一个方形的木桩插进一个圆孔里。Twisted中的所有内容都是异步的,因此您必须以不同的方式考虑事件的顺序。你不能说“这里有10个操作要一个接一个地运行”,那是串行思维。在

在Twisted中,发出第一个命令并注册一个回调,当它完成时将被触发。当该回调发生时,发出第二个命令并注册一个回调,该回调将在该回调完成时触发。以此类推。在

相关问题 更多 >

    热门问题