Как управлять соединениями с Twisted SSH сервером

Мне нужно создать скрученный сервер SSH, который принимает несколько команд. Но главная особенность в том, что сервер должен управлять соединением. Чтобы быть более конкретным, необходимо закрыть открытое соединение, если оно длится более 10 минут (например). Или он не должен принимать новое соединение, если уже есть 10 открытых соединений.

На самом деле я до сих пор не могу полностью понять, как все эти области, аватары, протоколы, порталы и т. Д. Взаимодействуют друг с другом. И я чувствую сильный недостаток документации. Есть несколько примеров, но без каких-либо комментариев о том, что именно происходит на каждом этапе.

В любом случае, пытаясь и терпя неудачу, я смог добавить выполнение необходимых команд в простой пример с ssh-сервером. Но я полностью теряюсь в том, как я могу отклонить новое соединение или закрыть существующее, или добавить некоторый флаг времени для нового соединения, который можно использовать для закрытия соединения, когда оно достигает ограничения по времени.

Любая помощь будет оценена. Пожалуйста, будьте добры ко мне, я никогда не работал с Twisted и на самом деле я новичок в Python:)

Спасибо.

ps извините за возможные ошибки, английский не мой родной.

1 ответ

Итак, главная проблема - ограничить количество подключений. Это действительно зависит от протокола, который вы хотели бы использовать. Предположим, вы используете 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
Другие вопросы по тегам