我正在尝试创建一个简单的telnet服务器,它读取用户输入的行并用各种文本回复,具体取决于这些行上的内容。在谷歌搜索之后,似乎共识是tiwsted
是用于此目的的最佳模块。不幸的是,它很庞大,我只是迷失在文档中,并且无法理解已发布的示例。 : - (
我目前的问题是,在某些情况下,用户必须输入类似密码的对象 - 即,没有他正在输入的内容显示在屏幕上。我可以通过指定我将通过self.transport.will(ECHO)
自己回复来关闭回声。问题是,我似乎无法将其重新打开。例如,self.transport.wont(ECHO)
无效。
以下是一些展示问题的示例代码:
#!/usr/bin/env python
from twisted.conch.telnet import TelnetTransport, StatefulTelnetProtocol, ECHO
from twisted.internet.protocol import ServerFactory
from twisted.application.internet import TCPServer
from twisted.application.service import Application
from twisted.internet import reactor
class TelnetEcho(StatefulTelnetProtocol):
user = ''
password = ''
state = ''
def connectionMade(self):
self.ip = self.transport.getPeer().host
self.transport.write('Welcome\r\n')
self.transport.write('User: ')
self.state = 'User'
def lineReceived(self, line):
if self.state == 'User':
self.user = line.strip()
self.transport.will(ECHO)
self.transport.write('Password: ')
self.state = 'Password'
elif self.state == 'Password':
self.password = line.strip()
self.transport.write('\r\n> ')
self.transport.wont(ECHO)
self.state = 'Prompt'
elif self.state == 'Prompt':
if line.strip() == 'quit':
self.transport.loseConnection()
return
self.sendLine(line)
self.transport.write('> ')
return
def CreateMyFactory():
factory = ServerFactory()
factory.protocol = lambda: TelnetTransport(TelnetEcho)
return factory
if __name__ == "__main__":
MyFactory = CreateMyFactory()
reactor.listenTCP(23, MyFactory)
reactor.run() else:
MyFactory = CreateMyFactory()
service = TCPServer(23, MyFactory)
application = Application("Telnet Echo Server")
service.setServiceParent(application)
任何帮助都将不胜感激。