2011-04-06 71 views
2

我有一個應用程序,調用telnetlib.read_until()。大多數情況下,它工作正常。 但是,當我的應用程序的telnet連接失敗時,很難調試確切的原因。它是我的腳本還是服務器連接狡猾? (這是一個開發實驗室,所以有一個lot狡猾的服務器)。「窺探」蟒蛇的telnetlib

我想什麼做的是能夠很容易地窺探)放入煮好的隊列前,我的應用程序調用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.process_rawq() - 內在價值無需修改telnetlib.py?

謝謝。

回答

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模塊​​調試,它打印了很多信息,以標準輸出。

在這種情況下,我會傾向於抓住wireshark/tshark/tcpdump並直接檢查網絡會話。

2

我只是找到了一個更好的解決方案(通過閱讀代碼,咄!)

telnetlib早已內置了調試輸出選項。請撥打set_debuglevel(1)和Bob的叔叔。