2015-04-28 7 views
1

Возможно, простое исправление относительно subprocesses, но я не могу понять, что происходит.Подпроцесс Python - tcpdump висит

У меня есть небольшой список веб-страниц, для которых я хочу захватить пакет. Я хочу один файл pcap на веб-страницу. Я использую tcpdump и phantomJS. Вот соответствующая часть кода:

from selenium import webdriver 
..more imports here.. 

URLs = ['https://webpage1.com', 'https://webpage2.com', etc.] 

driver = webdriver.PhantomJS(executable_path='/usr/bin/phantomjs', port=65000) 
driver.set_window_size(1024, 768) 

def Crawler(): 
    for eachHost in URLs: 
     print '\n* Capturing in-progress.' 
     print '* Host: ', eachHost 
     try: 
      handle = subprocess.Popen(['sudo', 'tcpdump', '-w', str(eachHost) + '.pcap'], stdout=subprocess.PIPE) 

      driver.get(eachHost) 
      time.sleep(5) 
      driver.close() 

      time.sleep(2) 
      handle.terminate() 
      print '* tcpdump killed.' 

     except: 
      print '* Exception caught.' 
      sys.exit(0) 
    sys.exit(0) 

Что я ожидаю, что это сделать: захватить первые 5 секунд каждой загрузке страницы и положить в отдельные pcaps

Что она делает: печатает ниже в моем терминале, а затем зависает, захватывая, но не заканчивая, а не на велосипеде на следующую веб-страницу.

Host: https://www.webpage1.com/ 
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 
+0

Вы хотите понюхать интерфейс '' eth0'' или '' loopback''? Если ваш веб-сервер находится в loopback, укажите интерфейс с помощью '' -i lo''. –

+0

Привет, я запускаю этот скрипт с виртуальной машины ubuntu на EC2, не уверен, что это отвечает на ваш вопрос. – jaydh

ответ

1

Я думаю, что причина, вы не можете завершить дочерний процесс, потому что вы начинаете процесс, используя команду sudo. Поскольку tcpdump затем выполняется как пользователь root, вы не можете просто прекратить его как обычного пользователя.

Я просто пробовал тестировать локально. После запуска ТСРйитра:

$ ps ax | grep tcpdump 
62410 s007 S+  0:00.01 sudo tcpdump 
62420 s007 S+  0:00.05 tcpdump 
62540 s008 S+  0:00.00 grep tcpdump 
$ kill -15 62410 
-bash: kill: (62410) - Operation not permitted 
$ kill -15 62420 
-bash: kill: (62420) - Operation not permitted 

Я не знаю способ выполнить SUDO убить/команду прекратить без запуска другого процесса (например, с помощью subprocess), так что я должен был бы получить процесс ТСРйитра идентификатора (pid) с использованием handle.pid и позвоните по телефону subprocess.Popen(['sudo', 'kill', '15', <pid>]).

+0

Спасибо, я решил отказаться от этой мысли и использовать функцию snipy scapy для записи пакетов непосредственно для каждого цикла, но такая же проблема возникает, и это даже не подпроцесс. Weird. – jaydh

+0

Задумывались ли вы о запуске всего скрипта Python с помощью 'sudo', а не только подпроцесса? (это чревато опасностью безопасности, поэтому, возможно, не обязательно лучший совет, просто чтобы вы знали) – bmhkim

+0

Да, я попробовал это во-первых, он производит ту же ошибку. – jaydh

0

Я думаю, что ваш вызов подпроцесса блокирует это, почему вы не можете его остановить. Попробуйте использовать multiprocessing и выбросите команду tcpdump в поток.

+0

Подпроцесс не блокируется так, если память правильно меня обслуживает. (зерно соли: прошло некоторое время с тех пор, как я сработал с подпроцессом) – bmhkim

+0

Dang flabbit! Вы абсолютно правы. Я не знаю, почему я забыл это: / –