Как я могу сделать так, чтобы tcpdump записывал в файл и выводил соответствующие данные?

Я хочу, чтобы tcpdump записывал необработанные пакетные данные в файл и отображал анализ пакетов в стандартном выводе по мере захвата пакетов (под анализом я подразумеваю строки, которые он обычно отображает, когда отсутствует -w). Кто-нибудь может сказать, пожалуйста, как это сделать?

5 ответов

Решение

Вот отличный способ сделать то, что вы хотите:

tcpdump -w - | tee somefile | tcpdump -r -

Что оно делает:

  • -w - говорит tcpdump записать двоичные данные в stdout
  • tee записывает двоичные данные в файл И в свои stdout
  • -r - говорит второй tcpdump чтобы получить свои данные из его stdin

Начиная с tcpdump 4.9.1, --print вариант можно использовать:

      tcpdump -w somefile --print
tcpdump ${ARGS} &
PID=$!
tcpdump ${ARGS} -w ${filename}
kill $PID

tcpdump > output.txt , если вы хотите сохранить выходные данные в файл в текстовом формате.

Используйте sudo, если есть проблемы с разрешениями.

Мой опыт, данные записываются постоянно.

Если вам нужен способ сделать это без двойного запуска tcpdump, подумайте:

sudo tcpdump port 80 -w $(tty) | tee /tmp/output.txt

Из интерактивной командной строки вы можете использовать $TTY вместо того $(tty) но в сценарии первое не будет установлено (хотя я не уверен, насколько распространено выполнение tcpdump в сценарии).

Примечание: это не совсем Unix-y способ, которым tcpdump по умолчанию заставляет вас писать в файл. Программы по умолчанию должны писать в stdout. Перенаправление к файлу уже обеспечивается конструкциями оболочки. Может быть, есть веская причина, по которой tcpdump разработан таким образом, но я не знаю, что это такое.

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