如何管理Twisted SSH服务器连接

时间:2013-07-17 15:33:57

标签: python ssh twisted twisted.conch

我需要创建接受多个命令的扭曲SSH服务器。但主要特征是服务器应该管理连接。更具体地说,如果持续时间超过10分钟,则需要关闭打开的连接(例如)。或者,如果已有10个开放连接,则不应接受新连接。

事实上,我仍然无法完全理解所有这些领域,头像,协议和门户等是如何相互作用的。我觉得缺乏文档。有几个例子,但没有任何关于每一步究竟发生了什么的评论。

无论如何,尝试和失败我能够向twisted simple ssh server example添加所需命令的执行。但我完全失去了如何拒绝新连接或关闭现有或为新连接添加一些时间标志,可用于在达到时间限制时关闭连接。

任何帮助将不胜感激。请善待我,我从来没有和Twisted一起工作,实际上我是在python中新人:)

谢谢。

P.S。我很抱歉可能出现错误,英语不是我的母语。

1 个答案:

答案 0 :(得分: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