tcpdump передается через grep, записанный в файл. (Странный номер 16) - PullRequest
0 голосов
/ 06 мая 2018

У меня есть следующая команда (из соображений конфиденциальности я изменил ip на 8.8.8.8):

tcpdump -i eth0 -nn udp portrange 27950-27970 и dst 8.8.8.8 | grep 'length 16 $'> testfile

Довольно прямо. Я хочу, чтобы все входящие пакеты длиной 16 записывались в файл, но по очень странной причине он не работает.

tcpdump -i eth0 -nn udp portrange 27950-27970 и dst 8.8.8.8 | grep 'длина 16 $'

Эта команда работает нормально и отображает именно то, что я хочу, но не в файле. Так что я уверен, что пакеты есть. Когда я использую ту же команду, но с длиной 34, как это:

tcpdump -i eth0 -nn udp portrange 27950-27970 и dst 8.8.8.8 | grep 'length 34 $'> testfile

Это записывает его в файл, а не в те пакеты, которые я хочу. Почему одна и та же команда работает с 34, а не с 16? Что такого особенного в 16? Я совершенно сбит с толку, потому что это кажется мне невозможным.

Первоначально я хотел снова передать команду в sed. Но конвейер также не работает с номером 16. Если я изменю «> testfile» на «| grep 8.8.8.8», то я не получу никакого вывода, и снова с 34 я получу вывод.

Может ли кто-нибудь из вас понять все это? Я наткнулся на очень странную ошибку? Я пытался и гуглил часами, но не повезло.

Заранее большое спасибо.

1 Ответ

0 голосов
/ 07 мая 2018

Проблема была в том, что я попытался сделать буферизацию строки tcpdump -l, но я не сделал grep --line-buffered.Это, похоже, делает свое дело.

Это была моя первая проблема, вплоть до следующей.Как сделать Sed Line буферизованной.И я могу сделать это с помощью команды unbuffer.Так что теперь я счастливый человек.Спасибо @AB за помощь.

edit: Это действительно работает.Так что не возражайте против понижения.Вероятно, это был один из злых детей, у которых не должно быть компьютера.

...