web-dev-qa-db-ja.com

pythonでのtcpdump出力の処理

Pythonでtcpdump出力を処理しようとしています。

必要なのは、tcpdump(パケットをキャプチャして情報を提供する)を実行し、出力を読み取って処理することです。

問題は、tcpdumpが永久に実行され続けることであり、出力されたらすぐにパケット情報を読み取って実行し続ける必要があります。

pythonのサブプロセスを調べて、popenを使用してtcpdumpを呼び出し、stdoutをパイピングしようとしましたが、機能しないようです。

これを進める方法に関する指示。

import subprocess

def redirect():
    tcpdump = subprocess.Popen("Sudo tcpdump...", stdin=subprocess.PIPE, stdout=subprocess.PIPE, Shell=True)
    while True:
        s = tcpdump.stdout.readline()
        # do domething with s

redirect()
12
ashish g

「-l」を使用してtcpdumpをラインバッファリングすることができます。次に、サブプロセスを使用して、出力が出力されたときにそれをキャプチャできます。

import subprocess as sub

p = sub.Popen(('Sudo', 'tcpdump', '-l'), stdout=sub.PIPE)
for row in iter(p.stdout.readline, b''):
    print row.rstrip()   # process here
18
swstephe

デフォルトでは、パイプはブロックバッファリングされ、インタラクティブ出力はラインバッファリングされます。サブプロセスのtcpdumpからのラインバッファパイプが必要なようです。

昔は、この種のことには、DanBernsteinの「pty」プログラムをお勧めします。今日、ptyは長い間更新されていないようですが、「emtpy」と呼ばれる新しいプログラムがあります。これは多かれ少なかれ同じ考えです: http://empty.sourceforge.net/ ==

サブプロセスで空の状態でtcpdumpを実行して、パイプに書き込んでいる場合でもtcpdump行をバッファリングしてみてください。

2
dstromberg