【问题标题】:"Snooping" python's telnetlib“窥探”python的telnetlib
【发布时间】:2012-05-11 00:00:25
【问题描述】:

我有一个调用 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() 内部的

是否有一种(更 Python 的)方法可以在不修改 telnetlib.py 的情况下窥探这个 telnetlib.process_rawq() 内部值?

谢谢。

【问题讨论】:

    标签: python debugging telnetlib


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      简单的破解方法是对库进行猴子补丁。将要更改的函数复制并粘贴到源代码中(不幸的是,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 模块进行内置调试,这会将大量信息打印到标准输出。

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

      【讨论】:

        猜你喜欢
        • 2015-06-14
        • 1970-01-01
        • 2017-02-27
        • 2021-01-09
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        • 2018-08-25
        相关资源
        最近更新 更多