窥探" python 的 telnetlib
我有一个应用程序,它会调用telnetlib.read_until()。大部分情况下,这个功能运行得很好。不过,当我的应用程序的telnet连接失败时,我很难找到具体的原因。是我的脚本有问题,还是服务器的连接不稳定?(这是一个开发实验室,所以有很多不稳定的服务器。)
我想做的是,能够轻松地查看在我的应用程序调用telnetlib.read_until()之前,放入“已处理队列”的数据(这样希望不会影响我的应用程序的运行)。
我在telnetlib.py里查看时发现,'buf[0]'正是我想要的数据:新添加的数据,没有因为查看“已处理队列”而重复的数据。我可以在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()内部的内容。
有没有一种(更符合Python风格的)方法,可以在不修改telnetlib.py的情况下查看telnetlib.process_rawq()内部的值?
谢谢。
2 个回答
我刚找到一个更好的解决办法(其实就是看看代码嘛!)
telnetlib这个库里已经有一个调试输出的选项了。只需要调用set_debuglevel(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来检查网络会话。