我正在实施一个Telnet服务器,我有两个Telnet实现:预身份验证和后身份验证。
核心问题是服务器发送\r\r\n
而不是\r\n
。通过逐步调试,我发现这是由于ProtocolTransportMixin
在类heriarchy中有两次。我认为这是由于pre-auth和post-auth传输以某种方式相互关联(一个是另一个的基本传输)。
有没有办法可以取消其中一个mixins的效果?
我的Telnet服务器工厂用
实例化lambda: TelnetTransport(MyOwnTelnetAuthTransport, ...)
MyOwnTelnetAuthTransport
是AuthenticatingTelnetProtocol
的子类。
验证后,我通过一个领域与我自己的TelnetBootstrapProtocol
子类连接。
由于TelnetTransport
和TelnetBootstrapProtocol
都ProtocolTransportMixin
在其\n
方法中用\r\n
取代write()
,我最终得到\r\r\n
1}} ...
答案 0 :(得分:0)
我用一种黑客来修复它。仍在寻找更好的解决方案。
使用TelnetTransport
将MyTelnet
子类化为以下实现:
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
类,那可能就是问题了吗?