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

Опитвам се да се справя с изхода на 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()

person ashish g    schedule 28.07.2013    source източник
comment
Можете ли да публикувате кода си досега? Благодаря.   -  person Blue Ice    schedule 28.07.2013
comment
можете да използвате псевдо-tty, за да принудите буфериран изход   -  person jfs    schedule 12.06.2015


Отговори (2)


Можете да направите tcpdump линеен буфер с "-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
person swstephe    schedule 28.07.2013
comment
използвайте for line in iter(p.stdout.readline, b''): print line, в Python 2 поради бъг в буфера за четене - person jfs; 12.04.2014
comment
for line in p.stdout: въвежда ненужно забавяне в изхода на Python 2 (OP иска: веднага щом изведе). Използвайте iter(..), както споменах по-горе. Вижте Python: четене на поточно въвеждане от subprocess.communicate() - person jfs; 12.06.2015

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

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

Може да опитате да стартирате tcpdump под празен във вашия подпроцес, за да направите tcpdump линията буферирана, въпреки че пише в канал.

person dstromberg    schedule 28.07.2013
comment
python има pty модул в stdlib. Или може да се използва pexpect. Има също stdbuf, script, unbuffer помощни програми, които могат да принудят буфериран изход - person jfs; 12.04.2014