1

Я заметил, что при использовании 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 ответа2

2

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

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

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

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

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 умрет с ошибкой "Closed pipe" после выхода из grep и не будет тратить больше процессорного времени или диска / Чтение пропускной способности SSD из файла.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .