Обработка выходных данных tcpdump в python

Im пытается обработать вывод tcpdump в python.

Мне нужно запустить tcpdump (который захватывает пакеты и дает мне информацию), прочитать вывод и обработать его.

проблема в том, что tcpdump продолжает работать вечно, и мне нужно прочитать информацию о пакете, как только он выйдет и продолжит это делать.

Я попытался заглянуть в подпроцесс python и попытался вызвать tcpdump, используя popen и трубопровод stdout, но, похоже, работа.

любые указания о том, как это сделать.

import subprocess

def redirect():
    tcpdump = subprocess.Popen("sudo tcpdump...", stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
    while True:
        s = tcpdump.stdout.readline()
        # do domething with s

redirect()

2 ответов


вы можете сделать tcpdump line-buffered с "- l". Затем вы можете использовать подпроцесс для захвата вывода по мере его выхода.

import subprocess as sub

p = sub.Popen(('sudo', 'tcpdump', '-l'), stdout=sub.PIPE)
for row in iter(p.stdout.readline, b''):
    print row.rstrip()   # process here

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

в старые времена мы бы рекомендовали программу "pty" Дэна Бернштейна для такого рода вещей. Сегодня кажется, что pty не обновлялся в течение длительного времени, но есть новая программа под названием "emtpy", которая более или менее такая же идея: http://empty.sourceforge.net/

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