2010-06-23 14 views
3

夥計們這是一個關於python扭曲ssh lib的問題。聲音的方式來餵給命令扭轉後的ssh reactor.run()

所有示例代碼甚至生產代碼,我看到了基於twisted.conch.ssh充當SSH客戶端都與服務器在這種模式交互:

  • 準備一些命令來遠程運行;
  • 定義回叫;
  • 啓動反應堆然後暫停新的反饋;

reactor.run()後,我從來沒有發現人們試圖傳遞命令給sshd,腳本只是坐在他們的等待。我認爲可以派生或產生東西來發送命令。然而,由於其中一個優點是它的解複用機制,所以它不必在作爲服務器運行時處理傳入的請求。我可以說這是一個合理的要求,不要叉(作爲客戶端腳本)不斷髮送請求到服務器?

對此有何想法?

TIA。

回答

4

joefis的答案基本上是正確的,但我敢打賭,一些例子會有所幫助。首先,有幾種方法可以在反應堆啓動後立即運行一些代碼。

這一個是非常簡單的:

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

reactor.callWhenRunning(f) 

另一種方法是使用定時事件,雖然可能沒有理由去做這種方式,而不是使用callWhenRunning

reactor.callLater(0, f) 

你也可以使用底層的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) 

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

$ twistd -ny thatfile.tac 

當然,這只是告訴你如何在反應堆運行後做一件事,這不完全是你要求的。不過,這是同樣的想法 - 您定義了一些事件處理程序並通過讓該處理程序調用來請求接收事件;當它被調用時,你會做東西。同樣的想法適用於你用海螺做的任何事情。

可以在sshsimpleclient.py在Conch examples看到這一點,比如我們有:

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事件處理程序,當通過通道接收字節時調用該事件處理程序,並在通道關閉時調用closed事件處理程序。

因此,您可以在這裏看到四個不同的事件處理程序,其中一些正在啓動操作,最終會觸發以後的事件處理程序。所以要回到你關於做一個又一個的問題的問題,如果你想打開兩個貓通道,一個接一個,那麼在closed事件處理程序可以打開一個新的通道(而不是停止反應堆爲它在這個例子中)。

0

你正在試圖把一個方形掛釘放在一個圓孔裏。 Twisted中的所有內容都是異步的,因此您必須以不同方式思考事件的順序。你不能說「這裏有10個連續運行的操作」,這是串行思維。

在Twisted中,您發出第一條命令並註冊一個回調,它在完成時將被觸發。當該回調發生時,您發出第二個命令並註冊一個回調,該回調將在完成時觸發。等等等等。