Tcpdump передается по конвейеру через grep, записанный в файл. (Странное число 16)

У меня есть следующая команда (я изменил 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 я получу вывод.

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

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

from man tcpdump: "-l Сделать строку стандартного вывода буферизированной".

A.B 07.05.2018 01:39

Stack Overflow - это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. О каких темах я могу спросить здесь в Справочном центре. Возможно, лучше спросить Суперпользователь или Обмен стеков Unix и Linux.

jww 07.05.2018 02:20

Спасибо за ваш ответ. Я пробовал добавить -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 $' дает результат, хотя это в основном та же команда.

P Peter 07.05.2018 10:43

@jww, он будет использоваться в сценарии bash, так что это вопрос разработки. Также в разделе «О чем здесь можно спросить» четко указано «программные инструменты, обычно используемые программистами». Я почти уверен, что он тоже подпадает под эту категорию.

P Peter 07.05.2018 11:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
487
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в следующем: я пытался сделать строку tcpdump буферизированной -l, но я не делал grep --line-buffered. Кажется, это помогает.

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

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

Другие вопросы по теме