Как мне прочитать вывод из tcpdump так быстро, как он выводит его на терминал?

333
anderspitman

При запуске tcpdump в командной строке пакеты отображаются в реальном времени по мере их получения. Однако, когда tcpdump передается по каналу, он использует буферизованный вывод. -lИ -Uварианты предусмотрены для обеспечения конфигурации этого. Однако я считаю, что независимо от того, какие параметры я установил, результат никогда не будет таким же быстрым, как при работе с необработанным интерфейсом командной строки. Я пробовал Python с подпроцессом, тройником и даже оболочкой Rust. Пакеты всегда отображаются в виде пакетов.

Есть идеи?

0
Вы уверены, что это не клиент (читатель) обрабатывает их в пакетном режиме? Patrick Mevzek 6 лет назад 0
Это конечно возможно. Я попытался отключить всю буферизацию в моих оболочках, и она все еще не работает. У вас есть предложение для надежного способа проверить это? anderspitman 6 лет назад 0
Использование `unbuffer` из пакета 'ожидаем`, кажется, исправляет это. Не совсем уверен, что это означает anderspitman 6 лет назад 0
Действительно зависит от вашего кода ... Во многих языках ввод / вывод буферизируется по умолчанию. Я также вижу это как комментарий в исходном коде небуфера: используйте псевдотерминал, чтобы обойти буферизацию блоков, выполняемую библиотекой stdio, когда стандартный вывод перенаправляется в файл или канал. Также см. Https://www.pixelbeat.org/programming/stdio_buffering/: «если stdout является терминалом, то буферизация автоматически устанавливается на буферизацию строки, в противном случае она устанавливается на буферизацию» и «если stdin / stdout подключены к терминалу тогда размер по умолчанию = 1024; иначе размер = 4096 " Patrick Mevzek 6 лет назад 0
См. [Этот ответ] (https://stackoverflow.com/a/25548995/5164855) и окружающие обсуждения для решения и объяснения проблем. AFH 6 лет назад 1

1 ответ на вопрос

0
anderspitman

Теперь есть tcpdump --immediate-mode, который решил эту проблему для меня. Чтобы заставить его работать, я использовал его вместе с -l.

Смотрите этот ответ .