2016-12-22 11 views
1

私はPythonスクリプトからUDPパケットをキャプチャするためにTcpdumpを開こうとしています。ここに私のコードは次のとおりです。Tcpdump:Pythonスクリプトからパケットをキャプチャできません。

os.system("tcpdump -i wlp2s0 -n dst 8.8.8.8 -w decryptedpackets.pcap &") 
testfile = urllib.URLopener() 
s = socket(AF_INET, SOCK_DGRAM) 
host = "8.8.8.8" 
port = 5000 
buf = 1024 
addr = (host, port) 
s.connect((host, port)) 
f = open("file.txt", "rb") 
data = f.read(buf) 

while (data): 
    if (s.sendto(data, addr)): 
     print "sending ..." 
     data = f.read(buf) 

私は手動でのシェルでこのコマンドを実行する場合、私は(PCAPファイルがコンテンツを持っている)パケットをキャプチャすることができています:

tcpdump -i wlp2s0 -n dst 8.8.8.8 -w decryptedpackets.pcap & 

しかし、私はos.systemを使用する場合( )私はパケットをキャプチャできません。 (私はPCAPファイルを開くと、私はそれが空で見つける)

私が検証され、Pythonスクリプトが実行されたときに作成されるプロセスがあることを発見した:

ルート10092 0.0 0.0 17856 1772 PTS/19 S 10時25午後12時00 のtcpdump -i wlp2s0 -n DST 8.8.8.8 -w decryptedpackets.pcap

また、私は、任意のアクセス許可の問題を回避するためにはsudoユーザーとしてこれを実行していますよ。

この問題の原因は何ですか?

+0

問題は何ですか?あなたは '.pcap'ファイルに' tcpdump'パケットを書いています。そしてあなたの 'ps'出力は、それがうまく立ち上げられたことを示しています。その部分は機能しているようです。しかし、あなたは 'ファイルを開きます。その内容をリモートホストに送信します。何が起こると思いますか? –

+0

問題は、os.system()を実行すると、キャプチャされたパケットがなく、pcapファイルが空であることです。しかし、シェルでtcpdumpコマンドを手動で実行すると、pcapファイルに内容がある –

+0

'&'を使わず、 'subprocess'モジュールから良い選択肢を選んでください。 –

答えて

0

python documentation

os.system(command)サブシェルでコマンド(文字列)を実行します。この は、標準C関数システム()を呼び出して実装され、 には同じ制限があります。 sys.stdinなどへの変更は、実行されたコマンドの環境の に反映されません。

UNIXでは、戻り値は、 で指定された形式でエンコードされたプロセスの終了ステータスです。 POSIXはCシステム()関数の戻り値の意味を と指定しないので、Python関数の戻り値 の値はシステムに依存します。 Windowsでは

は、戻り値は、Windowsの環境変数 COMSPECによって与えられ、コマンドを実行した後にシステムシェル によって返されること:command.comシステム(Windows 95、98およびME)で、これは常に 0です。 cmd.exeシステム(Windows NT、2000およびXP)では、コマンド実行の終了ステータスは です。非ネイティブシェルを使用するシステムでは、 シェルドキュメントを参照してください。

サブプロセスモジュールは、新しいプロセスを作成してその結果を取得するために、より強力な機能を提供します。そのモジュールを使用することは、この機能を使用することよりも好ましい です。 のサブプロセスドキュメントのサブプロセスモジュールセクションを参照してください。 役立つレシピ

は私がos.system戻ってすぐに、スクリプトがいって、コードには問題がないと思いますが、あなたはおそらく別のスレッドを作成し、私はそれがすぐに戻っていることを信じているのでtcp-dumpos.systemを呼び出す必要があります。

関連する問題