据我所知,来自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,但大多数都没有记录。任何人都能指出一个例子,它(或多或少)与上面的代码相同或重写它?提前致谢
答案 0 :(得分:1)
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
正在实施的内容。