2011-08-23 11 views
7

Sono in esecuzione tcpdump in un sottoprocesso come questo:Getting stdout da un sottoprocesso tcpdump dopo aver terminato lo

pcap_process = subprocess.Popen(['tcpdump', '-s 0', '-w -', 'tcp'], 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

L'argomento -w - è importante: si dice tcpdump per stampare il file .pcap risultante a stdout.

Quindi accedo per accedere a un sito Web utilizzando urllib.open(). Fatto questo, vorrei uccidere tcpdump e inserire qualsiasi cosa stampata in una stringa. Ho provato quanto segue:

pcap_process.terminate() 
result = pcap_process.stdout.read() # or readline(), etc. 

Ma (a meno che sto facendo qualcosa di sbagliato), che non funziona; Ho ucciso il processo, ora non c'è più niente da leggere. Se uso read() o communicate() prima di terminare, il mio script si limiterà a sedersi lì e leggere e continuare ad attendere che tcpdump termini (cosa che non lo farà).

C'è un modo per farlo (preferibilmente senza loop)?

+1

È necessario passare ciascuno dei parametri di 'tcpdump' separatamente:' Popen ([ 'tcpdump', '-s', '0', '-w', '-', 'tcp'], ...) '. Il singolo argomento '-w -' non viene interpretato come i due argomenti' -w' e '-', ecc. –

+0

Vero, sarebbe stata la risposta giusta :) Grazie comunque! –

risposta

8

Invece di utilizzare tcpdump, è spesso consigliabile utilizzare PCAP directly o Scapy.

Se questa non è un'opzione, è sufficiente chiamare communicate dopo il terminate - l'omissione di un processo non uccide i dati nelle condotte. Tuttavia, non dimenticate di separare gli argomenti nella creazione del sottoprocesso ([,'-w', '-'] anziché [... , '-w -', ..]):

pcap_process = subprocess.Popen(['tcpdump', '-s', '0', '-w', '-', 'tcp'], 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
+1

Sfortunatamente pypcap non è un'opzione qui :(... se lo faccio, l'output è vuoto Forse il problema è da qualche altra parte ... ಠ_ಠ –

+1

@sebastian_k ''-w -'' scrive in un file chiamato' - 'Volete o '' -w-'' o' '-w''''. Aggiornato la risposta – phihag

+0

Hai assolutamente ragione, che errore stupido. Grazie un mucchio, phihag! :) –

Problemi correlati