Обработка выходных данных 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 буферизованной, даже если она записывается в канал.