窥探" python 的 telnetlib

2 投票
2 回答
2003 浏览
提问于 2025-04-16 15:14

我有一个应用程序,它会调用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 个回答

2

我刚找到一个更好的解决办法(其实就是看看代码嘛!)

telnetlib这个库里已经有一个调试输出的选项了。只需要调用set_debuglevel(1),就可以搞定了。

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来检查网络会话。

撰写回答