2

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 のライブラリをアップグレードするたびに、この変更を忘れずにやり直す必要があります。

buf は telnet.process_rawq() の内部にあるため、単純に telnet.process_rawq() を拡張する試みは失敗しました。

telnetlib.py を変更せずに、この telnetlib.process_rawq() 内部値をスヌープする (より Pythonic な) 方法はありますか?

ありがとう。

4

2 に答える 2

2

はるかに優れた解決策を見つけました(コードを読むことで、当然です!)

telnetlib には、デバッグ出力オプションが既に組み込まれています。set_debuglevel(1) を呼び出すだけで、ボブはあなたのおじです。

于 2012-05-10T16:00:25.757 に答える
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)。これにより、多くの情報が stdout に出力されます。

このような状況では、wireshark/tshark/tcpdump を取得して、ネットワーク セッションを直接検査する傾向があります。

于 2011-04-06T21:14:19.320 に答える