Twisted Telnet Server:如何避免嵌套的CRLF

时间:2016-01-29 14:46:11

标签: python twisted telnet

我正在实施一个Telnet服务器,我有两个Telnet实现:预身份验证和后身份验证。

核心问题是服务器发送\r\r\n而不是\r\n。通过逐步调试,我发现这是由于ProtocolTransportMixin在类heriarchy中有两次。我认为这是由于pre-auth和post-auth传输以某种方式相互关联(一个是另一个的基本传输)。

有没有办法可以取消其中一个mixins的效果?

我的Telnet服务器工厂用

实例化
lambda: TelnetTransport(MyOwnTelnetAuthTransport, ...)

MyOwnTelnetAuthTransportAuthenticatingTelnetProtocol的子类。

验证后,我通过一个领域与我自己的TelnetBootstrapProtocol子类连接。

由于TelnetTransportTelnetBootstrapProtocolProtocolTransportMixin在其\n方法中用\r\n取代write(),我最终得到\r\r\n 1}} ...

2 个答案:

答案 0 :(得分:0)

我用一种黑客来修复它。仍在寻找更好的解决方案。

使用TelnetTransportMyTelnet子类化为以下实现:

class MyTelnet(TelnetTransport):
    """Sole purpose is to override write() and fix a CRLF nesting bug"""

    # Because of the presence of two ProtocolTransportMixin in the protocol
    # stack once authenticated, I need to override write() and remove a \r
    # otherwise we end up with \r\r\n on the wire.
    def write(self, bytes):
        self.transport.write(bytes.replace('\r\n', '\n'))

然后调整我的工厂以产生这个类而不是TelnetTransport修复它。

答案 1 :(得分:0)

首先,如果您实际上是在验证用户,请不要使用telnet。使用SSH。 Twisted提供conch,已经实现了协议。

其次,当您提出这样的问题时,请始终提供SSCCE。我不知道你的实际问题是什么,除非我可以运行你的代码,我不打算根据松散的描述重建你的代码。

最后,听起来你刚刚在Twisted中发现了一个错误,你应该提交它。 TelnetTransport不应该加倍CR,所以如果确实发生了这种情况,那么它不应该是代码中的hacky解决方法,而是上游的修复。

P.S。:MyOwnTelnetAuthTransport不是传输,它是TelnetProtocol,因此命名有点令人困惑。如果您在其层次结构中放置了Transport类,那可能就是问题了吗?