Как сделать Telnet по twisted.conch.telnet? - PullRequest
1 голос
/ 27 апреля 2011

Я понимаю, что Telnet из twisted.protocols.telnet устарел.Однако я не вижу, как новый Telnet из twisted.conch.telnet заменит его.Я написал очень простой фрагмент кода аутентификации telnet, который выглядит следующим образом:

from twisted.protocols.telnet import Telnet

class MyProtocol(Telnet):

    def welcomeMessage(self):
        return "Hi, Welcome to my telnet server"

    def loginPrompt(self):
        return "Who are you ?"

    def checkUserAndPass (self,u,p):
        # some stuff here

    def telnet_Command(self, cmd):
        self.transport.write("you typed " + cmd)

Он отлично работает, но в новом классе Telnet нет ни одного из этих стандартных методов.Я также проверил AuthenticatingTelnetProtocol, но большинство из них не задокументировано.Кто-нибудь может указать мне пример, который (более или менее) совпадает с приведенным выше кодом или переписать его?Заранее спасибо

1 Ответ

1 голос
/ 03 мая 2011

Основное различие между twisted.protocols.telnet и twisted.conch.telnet состоит в том, что первый реализует часть протокола Telnet (RFC 854) и добавляет некоторую «удобную» функциональность, которая применяется для стандартных сеансов в виде имени пользователя / пароля, тогда как последний реализует весь протокол Telnet и оставляет удобство для разработчика приложений.

К счастью, эту «удобную» функциональность не сложно реализовать самостоятельно. В основном это две вещи: разбор строк у клиента и вызов другого метода в зависимости от того, на какой стадии (или «состоянии») находится соединение. LineReceiver выполнит первое, а второе простое. Так, например:

from twisted.protocols.basic import LineReceiver
from twisted.conch.telnet import TelnetProtocol

class SimpleTelnetSession(LineReceiver, TelnetProtocol):

    def connectionMade(self):
        self.transport.write('Username: ')
        self.state = 'USERNAME'

    def lineReceived(self, line):
        getattr(self, 'telnet_' + self.state)(line)

    def telnet_USERNAME(self, line):
        self.username = line
        self.transport.write('Password: ')
        self.state = 'PASSWORD'

    ...

Это более или менее то, что AuthenticatingTelnetProtocol также реализует.

...