2016-12-22 4 views
1

Ich versuche Tcpdump zu öffnen, um UDP-Pakete von einem Python-Skript zu erfassen. Hier ist mein Code:Tcpdump: Kann Pakete von Python-Skript nicht erfassen

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) 

ich in der Lage bin, die Pakete zu erfassen (PCAP-Datei hat Inhalt), wenn ich manuell diesen Befehl in Shell ausführen:

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

jedoch Wenn ich os.system verwenden () Ich kann die Pakete nicht erfassen. (Wenn ich die pcap-Datei öffnen, finde ich es leer)

Ich habe überprüft und festgestellt, dass es ein Prozess ist, der erstellt wird, wenn das Python-Skript ausgeführt wird:

Wurzel 10.092 0,0 0,0 17.856 1.772 Punkte/19 S 10.25 00.00 tcpdump -i wlp2s0 -n dst 8.8.8.8 -w decryptedpackets.pcap

auch ich dies als sudo Benutzer renne keine Erlaubnis Probleme zu vermeiden.

Irgendwelche Vorschläge, was könnte dieses Problem verursachen?

+0

Was genau * ist * das Problem? Sie haben 'tcpdump', um Pakete in eine '.pcap'-Datei zu schreiben. Und Ihre 'ps' Ausgabe zeigt, dass sie erfolgreich gestartet wurde. Dieser Teil scheint zu funktionieren. Aber dann öffnest du eine 'Datei.txt' und sendet seinen Inhalt an einen Remote-Host. Was hast du erwartet? –

+0

Das Problem ist, dass, wenn ich das os.system() ausführen, die PCAP-Datei leer ist, ohne eingefangene Pakete. Wenn ich den tcpdump-Befehl in der Shell manuell ausführe, hat die pcap-Datei jedoch den Inhalt –

+0

Verwenden Sie nicht '&' und wählen Sie eine gute Alternative aus dem 'subprocess'-Modul. –

Antwort

0

Von python documentation.

os.system (Befehl) Führen Sie den Befehl (eine Zeichenfolge) in einer Untershell aus. Diese wird durch Aufruf des Standard-C-Funktionssystems() implementiert und hat die gleichen Einschränkungen wie . Änderungen an sys.stdin usw. werden nicht in der Umgebung des ausgeführten Befehls wiedergegeben.

Unter Unix ist der Rückgabewert der Exit-Status des Prozesses, der in dem für wait() angegebenen Format codiert ist. Beachten Sie, dass POSIX die -Bedeutung des Rückgabewerts der C-system() -Funktion nicht angibt, so dass der Rückgabewert Wert der Python-Funktion systemabhängig ist.

Unter Windows wird der Rückgabewert, dass nach Befehl durch die Variable Windows-Umgebung gegeben ausgeführt von dem System-Shell zurück COMSPEC: auf command.com Systemen (Windows 95, 98 und ME) ist dies immer 0; Auf den Systemen cmd.exe (Windows NT, 2000 und XP) ist dies der Ausgang Status des Befehls run; Auf Systemen, die eine nicht native Shell verwenden, finden Sie in Ihrer Shell-Dokumentation .

Das Subprozessmodul bietet leistungsfähigere Funktionen zum Erstellen von neuen Prozessen und Abrufen ihrer Ergebnisse; Verwenden dieses Moduls ist vorzuziehen, diese Funktion zu verwenden. Weitere Informationen finden Sie im Abschnitt Ersetzen älterer Funktionen mit dem Teilprozess Modul in der Subprozessordokumentation für einige hilfreiche Rezepte.

Ich denke, dass os.system kehrt sofort und das Skript läuft weiter, gibt es kein Problem mit dem Code, aber Sie müssen wahrscheinlich einen separaten Thread erstellen und os.system mit den tcp-dump nennen, da ich glaube, dass es sofort zurückkehrt.