2013-07-17 4 views
2

몇 가지 명령을 허용하는 twisted SSH 서버를 만들어야합니다. 그러나 주요 특징은 서버가 연결을 관리해야한다는 것입니다. 보다 구체적으로, 10 분 이상 지속되면 (예를 들어) 열린 연결을 닫아야합니다. 또는 이미 10 개의 연결이 열려 있으면 새로운 연결을 허용해서는 안됩니다.Twisted SSH 서버 연결을 관리하는 방법

실제로 이러한 모든 영역, 아바타, 프로토콜 및 포털 등이 서로 상호 작용하는 방식을 여전히 완전히 이해할 수 없습니다. 그리고 나는 문서의 부족함을 느낍니다. 몇 가지 예가 있지만 각 단계에서 정확히 무슨 일이 일어나고 있는지에 대한 의견이 없습니다.

어쨌든 시도하고 실패하여 twisted simple ssh server example에 필요한 명령의 실행을 추가 할 수있었습니다. 하지만 나는 새로운 연결을 거부하거나 기존의 연결을 닫을 수있는 방법을 완전히 잃어 버리거나 시간 제한에 도달하면 연결을 닫는 데 사용할 수있는 새로운 연결에 시간 플래그를 추가합니다.

도움을 주시면 감사하겠습니다. 제발 제게 친절 해요, 나는 Twisted로 일한 적이 없으며 실제로 저는 파이썬으로 newby입니다 :)

고맙습니다.

p.s. 실수가있을 수있어서 유감이지만, 영어는 제 모국어가 아닙니다.

답변

0

따라서 주요 문제는 연결 수를 제한하는 것입니다. 이것은 실제로 사용하려는 프로토콜에 따라 다릅니다. (예를 들어, AMP이 약간 다른 경우가 될 것이다, 같은 방식으로 작동합니다 Prototol의 다른 상속자를하지만) 당신은 기본 프로토콜로 LineOnlyReceiver를 사용의 가정하자

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