如何将 tcpdump 写入文件并标准输出适当的数据?

我希望有 tcpdump写原始数据包数据到一个文件,也显示数据包分析到标准输出的数据包被捕获(通过分析,我的意思是它显示正常行时,-w丢失)。 有人能告诉我怎么做吗?

149859 次浏览

这里有一个简单的方法来做你想做的事情:

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

它的作用:

  • -w -告诉 tcpdump将二进制数据写入 stdout
  • -U告诉 tcpdump在接收到数据包时将其写入标准输出,而不是对它们进行缓冲并分块输出
  • tee将该二进制数据写入一个文件 AND 到它自己的 stdout
  • -r -告诉第二个 tcpdump从它的 stdin获取数据
tcpdump ${ARGS} &
PID=$!
tcpdump ${ARGS} -w ${filename}
kill $PID

如果您想要一种不需要运行两次 tcpdump 的方法,请考虑:

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

在交互式命令提示符中,您可以使用 $TTY而不是 $(tty),但是在脚本中不会设置 $TTY(尽管我不确定在脚本中运行 tcpdump 有多常见)。

旁注: tcpdump 在默认情况下使您写入文件的方式不是很 Unix-y。默认情况下,程序应该写入标准输出。Shell 构造已经提供了对文件的重定向。也许 tcpdump 设计成这样是有原因的,但我不知道那是什么。

由于 tcpdump 4.9.34.99.0,可以使用 --print选项:

tcpdump -w somefile --print
Wednesday, December 30, 2020, by mcr@sandelman.ca, denis and fxl.
Summary for 4.99.0 tcpdump release
[...]
User interface:
[...]
Add --print, to cause packet printing even with -w.