Запустите tcpdump bash из python в течение x минут, используя подпроцесс - PullRequest
0 голосов
/ 13 января 2019

Я бы хотел запустить tcpdump из python за x минут, указанное пользователем. На данный момент моя функция выглядит так:

def tcpdump():
    run_time = int(input("\nHow many minutes would you like the bash to run?\n"))

    time_to_end = time.time() + 60 * run_time

    print("\ntcpdump running...\n")

    while time.time() < time_to_end:
        p = subprocess.Popen("./tcpdump.bash", shell=True) 
    p.terminate()

Однако, кажется, что это многократно запускает tcpdump, когда я получаю следующий вывод:

tcpdump: (all BPF devices are busy)
tcpdump: (all BPF devices are busy)
tcpdump: (all BPF devices are busy)

Я не уверен, как решить эту проблему, и, кроме того, я не уверен, как убить процесс, так как p.kill (), похоже, не работает.

----------------- РЕДАКТИРОВАНИЕ ---------------------

Теперь я попробовал следующее, однако я не уверен, что мой подпроцесс убит правильно или он будет работать бесконечно на заднем плане:

def tcpdump:
    run_time = int(input("\nHow many minutes would you like to collect benign data?\n"))

    time_to_end = time.time() + 60 * run_time

    print("\ntcpdump running...\n")

    p = subprocess.Popen(['tcpdump', '-i', 'en0', '-w', 'test.pcap']))
    while time.time() < time_to_end:
          p.communicate()
    p.kill()

1 Ответ

0 голосов
/ 13 января 2019

У вас отсортировано время, но проблема в том, что каждый раз, когда выполняется цикл, он снова будет popen и порождает новый процесс.

Скорее сделайте это так:

import threading
import subprocess

def tcpdump():
    print("\ntcpdump running...\n")
    p = subprocess.Popen("./tcpdump.bash", shell=True)
    p.wait()

run_time = int(input("\nHow many minutes would you like the bash to run?\n"))
t = threading.Thread(target=tcpdump, daemon=True)
t.start()
t.join(run_time * 60)

Функция tcpdump теперь просто открывает процесс и ожидает его закрытия. Основной код использует функцию Threading.join с указанным временем ожидания. По истечении времени ожидания поток child уничтожается и элемент управления возвращается обратно в родительский.

...