Получение stdout из подпроцесса tcpdump после его завершения - PullRequest
7 голосов
/ 23 августа 2011

Я выполняю tcpdump в подпроцессе, подобном следующему:

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

Аргумент -w - важен: он говорит tcpdump напечатать полученный файл .pcap в stdout.

Затем я захожу на сайт, используя urllib.open().После того, как это будет сделано, я хотел бы убить tcpdump и поместить все напечатанное в строкуЯ пробовал следующее:

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

Но (если я не делаю что-то не так), это не работает;Я убил процесс, теперь больше нечего читать.Если я использую read() или communicate() до завершения, мой сценарий просто будет сидеть там и продолжать читать, ожидая завершения tcpdump (чего не будет).

Есть ли способсделать это (желательно без петель)?

1 Ответ

8 голосов
/ 23 августа 2011

Вместо использования tcpdump часто рекомендуется использовать PCAP напрямую или Scapy .

Если это не вариант, просто позвоните communicateпосле terminate - уничтожение процесса не приводит к уничтожению данных в каналах к нему.Однако не забудьте разделить аргументы при создании подпроцесса ([,'-w', '-'] вместо [... , '-w -', ..]):

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