2

我有一个调用 telnetlib.read_until() 的应用程序。在大多数情况下,它工作正常。但是,当我的应用程序的 telnet 连接失败时,很难调试确切的原因。是我的脚本还是服务器连接不可靠?(这是一个开发实验室,所以有很多不可靠的服务器)。

我想做的是能够在我的应用程序调用 telnetlib.read_until() 之前轻松窥探放入熟队列中的数据(从而希望避免影响我的应用程序的操作。)

在 telnetlib.py 中翻找,我发现 'buf[0]' 正是我想要的数据:新添加的数据,没有窥探 'cookedq' 引起的重复。我可以在 telnetlib.process_rawq() 结尾之前插入一行,以打印从服务器接收到的处理数据。

telnetlib.process_rawq ...
    ...  
    self.cookedq = self.cookedq + buf[0]
    print("Dbg: Cooked Queue contents = %r" % buf[0]  <= my added debug line
    self.sbdataq = self.sbdataq + buf[1]

这很好用。我可以几乎完全按照我的应用程序接收到的数据来查看数据,而不会影响其操作。

问题来了:有没有更时髦的方法来实现这一点?这种方法是基本且有效的,但我必须记住每次升级 Python 库时都要重新进行此更改。

我尝试简单地扩展 telnet.process_rawq() 没有成功,因为 buf 是 telnet.process_rawq() 内部的

有没有(更 Pythonic)的方法来窥探这个 telnetlib.process_rawq()-internal 值而不修改 telnetlib.py?

谢谢。

4

2 回答 2

2

我刚刚找到了一个更好的解决方案(通过阅读代码,呵呵!)

telnetlib 已经内置了调试输出选项。只需调用 set_debuglevel(1),Bob 就是你的叔叔。

于 2012-05-10T16:00:25.757 回答
1

简单的破解方法是对库进行猴子补丁。将要更改的函数复制并粘贴到源代码中(不幸的是,process_rawq 是一个相当大的函数),然后根据需要进行修改。然后,您可以用自己的方法替换类中的方法。

import telnetlib

def process_rawq(self):
    #existing stuff
    self.cookedq = self.cookedq + buf[0]
    print("Dbg: Cooked Queue contents = %r" % buf[0]
    self.sbdataq = self.sbdataq + buf[1]

telnetlib.Telnet.process_rawq = process_rawq

您也可以尝试使用 telnetlib 模块内置的调试set_debuglevel(1),它将大量信息打印到标准输出。

在这种情况下,我倾向于直接抓取wireshark/tshark/tcpdump 并直接检查网络会话。

于 2011-04-06T21:14:19.320 回答