如何使用Twisted在Telnet服务器上打开echo

时间:2017-01-12 10:41:27

标签: python twisted telnet

我正在尝试创建一个简单的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)

任何帮助都将不胜感激。

0 个答案:

没有答案