2013-07-17 60 views
2

我需要創建扭曲的SSH服務器,它接受幾個命令。但主要特點是服務器應該管理連接。更具體地說,如果持續超過10分鐘(例如),它需要關閉打開的連接。或者如果已經有10個打開的連接,它不應該接受新的連接。如何管理扭曲的SSH服務器連接

事實上,我還不能完全理解所有這些領域,頭像,協議和門戶等是如何相互作用的。我覺得缺乏文檔。有幾個例子,但沒有任何評論每一步到底發生了什麼。

無論如何,嘗試和失敗我能夠將所需命令的執行添加到twisted simple ssh server example。但我完全喪失瞭如何拒絕新連接或關閉現有連接,或者爲新連接添加了一些時間標記,以便在達到時間限制時用於關閉連接。

任何幫助,將不勝感激。請善待我,我從來沒有與Twisted工作過,實際上我是Python中的新手:)

謝謝。

p.s.我對可能的錯誤感到抱歉,英語不是我的本地人。

回答

0

所以,主要問題是限制連接的數量。這實際上取決於你想使用的協議。讓我們假設,您使用LineOnlyReceiver爲基地協議(的Prototol其他繼承人的行爲以同樣的方式,但是,例如,AMP會有點不同的情況下):

from twisted.internet.protocol import ServerFactory 
from twisted.protocols.basic import LineOnlyReceiver 


class NoConnectionSlots(Exception): 
    message = "Sorry, bro. There are no free slots for you. Try again later." 


class ExampleProtocol(LineOnlyReceiver): 

    def connectionMade(self): 
     try: 
      self.factory.client_connected(self) 
     except NoConnectionSlots as e: 
      self.sendLine("{:}\\n".format(unicode(e))) 
      self.transport.loseConnection() 

    def connectionLost(self, reason): 
     self.factory.client_left(self) 


class ExampleServerFactory(ServerFactory): 

    protocol = ExampleProtocol 
    max_connections = 10 

    def __init__(self): 
     self._connections = [] 

    def client_connected(self, connection): 
     if len(self._connections) < self.max_connections: 
      raise NoConnectionSlots() 
     self._connections.append(connection) 

    def client_left(self, connection): 
     try: 
      self._connections.remove(connection) 
     except ValueError as e: 
      pass # place for logging