2013-07-28 10 views
7

Ich versuche, tcpdump Ausgabe in Python zu behandeln.Handhabung tcpdump Ausgabe in Python

Was ich brauche, ist tcpdump (die die Pakete erfasst und gibt mir Informationen) und lesen Sie die Ausgabe und verarbeiten Sie es.

Das Problem ist, dass Tcpdump für immer läuft und ich die Paketinformation lesen muss, sobald es ausgibt und es weiter macht.

Ich habe versucht, Unterprozess von Python zu suchen und versuchte tcpdump mit popen und Piping die stdout aufrufen, aber es scheint nicht zu funktionieren.

Alle Anweisungen, wie Sie damit fortfahren können.

+0

Können Sie Ihren Code bisher posten? Vielen Dank. –

+0

Sie könnten [Pseudo-Tty verwenden, um Zeilen gepufferte Ausgabe zu erzwingen] (http://StackOverflow.com/a/12471855/4279) – jfs

Antwort

14

Sie können tcpdump Zeile-gepuffert mit "-l" machen. Dann können Sie Subprozess verwenden, um die Ausgabe zu erfassen, sobald sie ausgegeben wird.

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 
+0

verwenden können Zeile für Zeile (p.stdout.readline, b ''): Zeile drucken,' in Python 2 wegen ["readahead buffer" bug] (http://bugs.python.org/issue3907) – jfs

+0

'für Zeile in p.stdout:' führt unnötige Verzögerung in der Ausgabe von Python 2 ein (OP will: * "sobald es ausgegeben wird "*). Benutze 'iter (..)' wie ich oben erwähnt habe. Siehe [Python: Streaming-Eingabe von subprocess.communicate()] lesen (http://stackoverflow.com/a/17698359/4279) – jfs

1

Standardmäßig sind Pipes blockweise gepuffert und interaktive Ausgabe wird gepuffert. Es klingt, als ob Sie eine gepufferte Leitung benötigen - von tcpdump in einem Subprozess kommend.

In den alten Tagen würden wir Dan Bernsteins "Pty" -Programm für diese Art von Sache empfehlen. Heute scheint es, dass pty nicht in einer langen Zeit aktualisiert hat, aber es gibt ein neues Programm „emtpy“ aufgerufen, die mehr oder weniger die gleiche Idee ist: http://empty.sourceforge.net/

Sie könnten versuchen, läuft tcpdump unter leer in Ihrem subprocess tcpdump Zeile gepuffert zu machen, obwohl es in eine Pipe schreibt.

+1

Python hat 'Pty' Modul in StdLib. Oder "Pexpect" könnte verwendet werden. Es gibt auch 'stdbuf',' script', 'unbuffer' Dienstprogramme, die Zeile-gepufferte Ausgabe – jfs