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)?
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. –
To prawda, że byłaby to właściwa odpowiedź :) Dzięki! –