2011-08-23 8 views
7

Używam tcpdump w podproces tak:Pierwsze stdout z podproces tcpdump po zakończeniu to

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

-w - argument jest ważny: mówi tcpdump wydrukować plik wynikowy .pcap do stdout.

Następnie przechodzę do strony internetowej, używając urllib.open(). Po wykonaniu tej czynności chciałbym zabić tcpdump i umieścić to, co zostało wydrukowane w ciągu znaków. Próbowałem następujące:

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

Ale (chyba że robię coś nie tak), to nie działa; Zabiłem ten proces, teraz nie ma już nic do czytania. Jeśli użyję read() lub communicate() przed zakończeniem, mój skrypt po prostu usiądzie tam i będzie czytać dalej, czekając na zakończenie tcpdump (której nie będzie).

Czy istnieje sposób, aby to zrobić (najlepiej bez pętli)?

+1

Trzeba przejść każdy z parametrów do 'tcpdump' oddzielnie:' POPEN ([ „tcpdump”, "-s", "0", "-w", "-", "tcp"], ...) '. Pojedynczy argument '-w-' nie zostanie zinterpretowany tak samo jak dwa argumenty '-w' i' -', itp. –

+0

To prawda, że ​​byłaby to właściwa odpowiedź :) Dzięki! –

Odpowiedz

8

Zamiast używać tcpdump, często zaleca się używanie PCAP directly lub Scapy.

Jeśli to nie jest opcja, po prostu zadzwoń pod communicate po terminate - zabicie procesu nie zabija danych w rurach do niego. Nie należy jednak zapominać, aby oddzielić argumenty w tworzeniu podproces ([,'-w', '-'] zamiast [... , '-w -', ..]):

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

Niestety pypcap nie jest tu opcją :(... jeśli to zrobię, dane wyjściowe są puste.Może problem jest gdzieś indziej ... ಠ_ಠ –

+1

@sebastian_k ''-w -'' zapisuje do pliku o nazwie' - 'Chcesz albo' '-w-'' albo' '-w '' -'' Zaktualizował odpowiedź – phihag

+0

Masz absolutną rację, co za głupi błąd, dzięki, phihag! :) –