如何通过twisted.conch.telnet进行Telnet?

时间:2011-04-27 15:05:49

标签: twisted telnet deprecated

据我所知,来自twisted.protocols.telnet的Telnet已弃用。但是,我看不出twisted.conch.telnet中较新的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 个答案:

答案 0 :(得分:1)

twisted.protocols.telnettwisted.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正在实施的内容。