Как успокоить вывод tcpdump при чтении файла pcap?

Я замечаю, что при использовании tcpdump чтобы прочитать файл pcap, tcpdump Команде каким-то образом удается вывести информацию на мою консоль, даже когда я перенаправляю STDOUT и STDERR. Как я могу предотвратить tcpdump из печати "reading from file capture, link type EN10MB (Ethernet)"каждый раз, когда он работает?

Например, следующая команда печатает строку, когда я ничего не ожидал:

$ tcpdump -A -r capture.pcap | grep interesting-string > /dev/null 2>&1
reading from file capture.pcap, link-type EN10MB (Ethernet)

Я хотел бы предотвратить появление этой строки, потому что она добавляет ненужный и нежелательный шум в вывод скрипта. Я проверил справочную страницу и не увидел опции, позволяющей предотвратить появление этого сообщения. Я искал в Интернете способы подавления вывода, не захваченного STDOUT и STDERR, и нашел несколько обращений, но ни одного, которое я мог бы понять или использовать в этом контексте.

2 ответа

Решение

Я думаю, что вы хотите поместить перенаправление вывода перед конвейером, чтобы оно применялось к выводу tcpdump, а не к grep.

tcpdump -A -r capture.pcap 2>&1 | grep interesting-string > /dev/null

Более подробная версия ответа Спиффа:

Если у вас есть трубопровод

command1 | command2

затем стандартный вывод команды 1, но не ее стандартная ошибка, перенаправляется на канал, идущий к стандартному вводу команды 2.

Так что если вы делаете

command1 | command2 >/dev/null 2>&1

который отправляет стандартный вывод команды 2 /dev/nullи отправляет стандартную ошибку в то же место, куда был отправлен стандартный вывод (так что /dev/null в этом случае), но он ничего не делает со стандартной ошибкой команды 1 и оставляет стандартный вывод команды 1 по конвейеру для стандартного ввода команды 2.

Тем не менее, команда

command1 2>/dev/null | command2 >/dev/null 2>&1

отправит стандартный вывод команды 1 на стандартный ввод команды 2, стандартная ошибка команды 1 - /dev/nullи стандартный вывод и ошибка команды 2 для /dev/nullи команда

command1 2>&1 | command2 >/dev/null 2>&1

отправит стандартный вывод команды 1 на стандартный ввод команды 2, стандартную ошибку команды 1 в то же место, что и стандартный вывод команды 1, т. е. на стандартный ввод команды 2, и отправит стандартный вывод и ошибка команды 2 в /dev/null,

Так, например

tcpdump -A -r capture.pcap 2>&1 | grep interesting-string > /dev/null 2>&1

вызовет grep чтобы увидеть как стандартный вывод и ошибку tcpdump (так что увидим reading from file... сообщение, и сопоставьте его, если интересная строка является его частью), и отправьте стандартный вывод и ошибку grep в /dev/null, поэтому он не должен выдавать никаких результатов, он должен просто дать статус выхода grep (я предполагаю, что это ваше намерение, т.е. все, что вы хотите знать, это то, является ли интересная строка частью какого-либо из пакетов).

Кстати, если вы используете grep чтобы узнать, является ли данная строка частью ее ввода или нет, и не хотите вывода, попробуйте использовать grep -q если ваша версия grep поддерживает это; это будет работать быстрее, потому что

  1. grep не нужно тратить процессорное время на запись в /dev/null;
  2. grep может завершиться, как только увидит строку, так что он не будет тратить больше времени на чтение ЦП, а tcpdump умрет с ошибкой "Закрытая труба" после grep завершает работу и не будет тратить больше времени процессора или чтения полосы пропускания диска /SSD из файла.

(Старые версии grep используемый -s для той же цели, но стандарт UNIX говорит, что это -qи большинство UNIX и UNIX-подобных систем делают это сейчас; GNU grep, например, использует -q.)

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