У меня есть следующая команда (я изменил ip на 8.8.8.8 из соображений конфиденциальности):
tcpdump -i eth0 -nn udp portrange 27950-27970 and dst 8.8.8.8 | grep 'length 16$' > testfile
Довольно прямолинейно. Я хочу, чтобы все входящие пакеты длиной 16 записывались в файл, но по очень странной причине это не работает.
tcpdump -i eth0 -nn udp portrange 27950-27970 and dst 8.8.8.8 | grep 'length 16$'
Эта команда отлично работает и отображает именно то, что я хочу, только не в файле. Так что я уверен, что пакеты есть. Когда я использую ту же команду, но с длиной 34, вот так:
tcpdump -i eth0 -nn udp portrange 27950-27970 and dst 8.8.8.8 | grep 'length 34$' > testfile
Это записывает в файл только не те пакеты, которые мне нужны. Почему одна и та же команда работает с 34, а не с 16? Что такого особенного в 16? Я полностью сбит с толку, потому что мне это кажется невозможным.
Первоначально я хотел снова передать команду в sed. Но конвейер также не работает с номером 16. Если я изменю "> testfile" на "| grep 8.8.8.8", я не получу никакого вывода, и снова с 34 я получу вывод.
Может ли кто-нибудь из вас разобраться во всем этом? Я наткнулся на очень странную ошибку? Я пытался и гуглил в течение нескольких часов, но безуспешно.
Заранее большое спасибо.
Stack Overflow - это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. О каких темах я могу спросить здесь в Справочном центре. Возможно, лучше спросить Суперпользователь или Обмен стеков Unix и Linux.
Спасибо за ваш ответ. Я пробовал добавить -l, но безуспешно. Получаю тот же результат. Однако это как-то связано с буфером, потому что я оставил команду включенной на ночь, и результат был только что. Странно то, что он буферизуется только в том случае, если я добавляю что-то после длины 16 $. «tcpdump -i eth0 -nnl udp portrange 27950-27970 и dst 8.8.8.8 | grep 'length 16 $' | grep 8.8» не дает результата, поэтому он помещается в буфер. Но команда «tcpdump -i eth0 -nn -l udp portrange 27950-27970 и dst 8.8.8.8 | grep 8.8 | grep 'length 16 $' дает результат, хотя это в основном та же команда.
@jww, он будет использоваться в сценарии bash, так что это вопрос разработки. Также в разделе «О чем здесь можно спросить» четко указано «программные инструменты, обычно используемые программистами». Я почти уверен, что он тоже подпадает под эту категорию.





Проблема заключалась в следующем: я пытался сделать строку tcpdump буферизированной -l, но я не делал grep --line-buffered. Кажется, это помогает.
Это была моя первая проблема, вплоть до следующей. Как сделать строку sed буферизованной. И я могу сделать это с помощью команды unbuffer. Так что теперь я счастливый человек. Спасибо @ A.B за помощь.
изменить: это действительно работает. Так что не возражайте против голоса против. Вероятно, это был один из тех злых детей, которым не следует иметь компьютер.
from man tcpdump: "-l Сделать строку стандартного вывода буферизированной".