7

私はtcpdumpこのようなサブプロセスで実行しています:

pcap_process = subprocess.Popen(['tcpdump', '-s 0', '-w -', 'tcp'], 
                                  stdout=subprocess.PIPE, stderr=subprocess.PIPE)

-w -引数は重要です。結果の .pcap ファイルを に出力するように指示しtcpdumpますstdout

次に、 を使用して Web サイトにアクセスしますurllib.open()。これが完了したら、印刷されたものをすべて殺しtcpdump、文字列に入れたいと思います。私は次のことを試しました:

pcap_process.terminate()
result = pcap_process.stdout.read()    # or readline(), etc.

しかし(私が何か間違ったことをしていない限り)、それはうまくいきません。プロセスを強制終了したため、読み取るものは何も残っていません。read()終了する前にorを使用するcommunicate()と、スクリプトはそこに座って読み続けtcpdump、終了するのを待ちます (そうはなりません)。

これを行う方法はありますか(できればループなしで)?

4

1 に答える 1

8

tcpdump を使用する代わりに、PCAP を直接使用するか、Scapyを使用することをお勧めします。

communicateそれができない場合は、単純に afterを呼び出します。terminateプロセスを強制終了しても、パイプ内のデータは強制終了されません。ただし、サブプロセスの作成時に引数を区切ることを忘れないでください ( の[,'-w', '-']代わりに[... , '-w -', ..]):

pcap_process = subprocess.Popen(['tcpdump', '-s', '0', '-w', '-', 'tcp'],
                                  stdout=subprocess.PIPE, stderr=subprocess.PIPE)
于 2011-08-23T16:00:05.077 に答える