【发布时间】:2018-05-06 20:23:18
【问题描述】:
我有以下命令(出于隐私原因,我将 ip 更改为 8.8.8.8):
tcpdump -i eth0 -nn udp 端口范围 27950-27970 和 dst 8.8.8.8 | grep 'length 16$' > 测试文件
非常直接。我希望将所有长度为 16 的传入数据包写入一个文件,但出于一个非常奇怪的原因,它不起作用。
tcpdump -i eth0 -nn udp 端口范围 27950-27970 和 dst 8.8.8.8 | grep '长度 16$'
此命令运行良好,并且完全显示了我想要的内容,只是不在文件中。所以我很肯定数据包在那里。当我使用相同的命令但长度为 34 时:
tcpdump -i eth0 -nn udp 端口范围 27950-27970 和 dst 8.8.8.8 | grep 'length 34$' > 测试文件
确实将它写入文件,而不是我想要的数据包。为什么完全相同的命令适用于 34 而不是 16? 16岁有什么特别之处?我完全糊涂了,因为这对我来说似乎是不可能的。
最初我想将命令再次通过管道传输到 sed。但是管道也不适用于数字 16。如果我将 "> testfile" 更改为 "| grep 8.8.8.8" 那么我将不会得到任何输出,并且再次使用 34 我会得到输出。
你们中的任何人都能理解这一切吗?我是否偶然发现了一个非常奇怪的错误?我一直在尝试和谷歌搜索几个小时,但没有运气。
非常感谢您。
【问题讨论】:
-
来自 man tcpdump: "-l 使标准输出行缓冲。"
-
Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地点。
-
感谢您的回复。我尝试添加 -l 但没有任何运气。我得到相同的结果。但是,它确实与缓冲区有关,因为我将命令打开了一夜,并且刚刚有结果。奇怪的是,如果我在长度 16$ 之后添加一些东西,它只会缓冲。 “tcpdump -i eth0 -nnl udp portrange 27950-27970 and dst 8.8.8.8 | grep 'length 16$' | grep 8.8” 没有给出结果,所以它被缓冲了。但是“tcpdump -i eth0 -nn -l udp portrange 27950-27970 and dst 8.8.8.8 | grep 8.8 |grep 'length 16$' 确实给出了结果,而它基本上是相同的命令。
-
@jww ,它将在 bash 脚本中使用,因此这是一个非常好的开发问题。同样在“我可以在这里问什么主题”中明确指出“程序员常用的软件工具”。我很确定它也属于该类别。
标签: linux redirect pipe tcpdump