- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
伙计们,这是一个关于 python twisted ssh lib 的问题。
我看到的所有基于twisted.conch.ssh 充当ssh 客户端的示例代码甚至生产代码都是以这种模式与服务器交互:
在 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/
我有一个曾经是 TreeView 控件的菜单,但现在我想让每个项目更加直观,并向树中的每个对象添加更多信息。 我的第一个意图是制作一个代表项目的用户控件,并在运行时将它们添加到面板中。这是一个好方法吗
我是 Docker 新手,想知道是否有可能(并且是一个好主意)在 Docker 容器中进行开发。我的意思是创建一个容器,执行 bash,安装和配置我需要的一切,然后开始在容器内进行开发。 容器将成为我
在 Java 中: Parent obj = new Child(); 我创建了一个 Parent 类型的对象。我假设我只能调用父类中定义的方法。因此,我无法调用 Child 中定义的“附加”方法或访
注意:我省略了其他两个阶段(V 和 W)的代码,示例中不需要。 我很确定,我这样处理“开”和“关”时间的方式并不是一种有效的方式。 我想使用查找表实现“开”和“关”脉动。计时器应与表的当前选定值进行比
当代码中包含 Java instanceof 运算符时,许多人会扬起眉毛并说这是禁忌。例如,在这个 other SO Q&A ,答案说: Note that if you have to use th
我是一名优秀的程序员,十分优秀!