我有一个调用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?
谢谢。
最佳答案
容易的办法是猴子修补库。将要更改的函数复制并粘贴到源代码中(不幸的是,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)
内置到telnetlib模块中的调试,该调试将向stdout打印很多信息。在这种情况下,我倾向于只抓wireshark / tshark / tcpdump并直接检查网络会话。