Я бег tcpdump
внутри Python, и я хотел бы знать, сколько пакетов являются сброшенным ядром.Подпроцесс Python: stderr сохраняет только первую строку. Зачем?
При запуске в командной строке, ТСРйитр выглядит следующим образом:
[email protected]:$ sudo tcpdump -w myPackets.cap -i eth0 ip
tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
^C28 packets captured
28 packets received by filter
0 packets dropped by kernel
Это, как я называю tcpdump
в моем сценарии Python:
f_out = open("tcpdumpSTDOUT", "w")
f_err = open("tcpdumpSTDERR", "w")
tcpdumpProcess = subprocess.Popen(['tcpdump',
'-w', 'myPackets.cap', '-i', 'eth0', '-n','ip'],
stdout=f_out,
stderr=f_err)
# a few seconds later:
tcpdumpProcess.kill()
f_in.close()
f_out.close()
Теперь, если я смотрю на tcpdumpSTDERR
, я только см. первая из обычных линий вывода:
Tcpdump: прослушивание на eth0, канального типа EN10MB (Ethernet), захват размер 65535 байт
Где все остальное?
EDIT Я попробовал другой подход:
>>> myProcess = subprocess.Popen("tcpdump -w myPackets.cap -i eth2 ip", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> myProcess.communicate()
Тогда я убил ТСРйитр из другой оболочки, а выход commnunicate (отображался):
('', 'tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes\n')
... еще первая строка!
EDIT 2 Интересно:
>>> import shlex
>>> a = subprocess.Popen(shlex.split("tcpdump -w myPackets.cap -i eth2 ip"), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> a.terminate()
>>> a.communicate()
('', 'tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes\n221 packets captured\n221 packets received by filter\n0 packets dropped by kernel\n')
, что в 'f_out'? – inspectorG4dget
абсолютно ничего. Он пуст –
Вы пробовали перенаправление вывода в вызове 'subprocess'? т. е. 'tcpdump ...> tcpdumpSTDOUT' – inspectorG4dget