2013-07-28 11 views
7

Sto cercando di gestire l'output di tcpdump in python.Gestione dell'output di tcpdump in python

Quello che mi serve è eseguire tcpdump (che cattura i pacchetti e mi dà informazioni) e leggere l'output ed elaborarlo.

Il problema è che tcpdump continua a funzionare per sempre e ho bisogno di leggere le informazioni sul pacchetto non appena esce e continua a farlo.

Ho provato a esaminare il sottoprocesso di python e ho provato a chiamare tcpdump usando popen e piping lo stdout ma non sembra funzionare.

Qualsiasi indicazione su come procedere.

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

Puoi pubblicare il tuo codice finora? Grazie. –

+0

si potrebbe [usare pseudo-tty per forzare l'output con buffer di linea] (http://stackoverflow.com/a/12471855/4279) – jfs

risposta

14

È possibile eseguire il buffer di linea tcpdump con "-l". Quindi è possibile utilizzare il sottoprocesso per acquisire l'output mentre esce.

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

usare' per line in iter (p.stdout.readline, b ''): print line, 'in Python 2 a causa di ["buffer readahead"] (http://bugs.python.org/issue3907) – jfs

+0

'per la riga in p.stdout:' introduce un ritardo non necessario nell'output su Python 2 (OP vuole: * "non appena viene emesso "*). Usa 'iter (..)' come ho detto sopra. Vedi [Python: leggere lo streaming di input da subprocess.communicate()] (http://stackoverflow.com/a/17698359/4279) – jfs

1

Per default, i tubi sono blocco tamponata e output interattivo è tamponata linea. Sembra che tu abbia bisogno di una pipe con buffer di riga, proveniente da tcpdump in un sottoprocesso.

In passato raccomandavamo il programma "pty" di Dan Bernstein per questo genere di cose. Oggi, sembra che Pty non è stato aggiornato da molto tempo, ma c'è un nuovo programma chiamato "vuoto Fai", che è più o meno la stessa idea: http://empty.sourceforge.net/

Si potrebbe provare a tcpdump esecuzione sotto vuoto nel sottoprocesso per rendere bufferizzata la linea tcpdump anche se sta scrivendo su una pipe.

+1

python ha il modulo 'pty' in stdlib. O potrebbe essere usato 'pexpect'. Ci sono anche le utility 'stdbuf',' script', 'unbuffer' che possono forzare l'output con buffer di linea – jfs