“窥探”python的telnetlib

时间:2011-04-06 20:51:24

标签: python debugging telnetlib

我有一个调用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() - 内部值而不修改telnetlib.py?

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 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

您也可以使用set_debuglevel(1)尝试使用{{1}}内置到telnetlib模块的调试,它会向stdout输出大量信息。

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