Получение stdout из подпроцесса tcpdump после его завершения

Я запускаю 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 (а этого не произойдет).

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


person sk29910    schedule 23.08.2011    source источник
comment
Вам нужно передать каждый из параметров в tcpdump отдельно: Popen(['tcpdump', '-s', '0', '-w', '-', 'tcp'], ...). Единственный аргумент -w - не интерпретируется так же, как два аргумента -w и - и т. д.   -  person Adam Rosenfield    schedule 23.08.2011
comment
Верно, это был бы правильный ответ :) Все равно спасибо!   -  person sk29910    schedule 23.08.2011


Ответы (1)


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

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

pcap_process = subprocess.Popen(['tcpdump', '-s', '0', '-w', '-', 'tcp'],
                                  stdout=subprocess.PIPE, stderr=subprocess.PIPE)
person phihag    schedule 23.08.2011
comment
К сожалению, pypcap здесь не подходит :( ... если я это сделаю, вывод будет пуст. Может быть, проблема где-то еще... ಠ_ಠ - person sk29910; 23.08.2011
comment
@sebastian_k '-w -' записывает в файл с именем -. Вы хотите либо '-w-', либо '-w' '-'. Обновил ответ. - person phihag; 23.08.2011
comment
Вы абсолютно правы, какая глупая ошибка. Большое спасибо, phihag! :) - person sk29910; 23.08.2011