【问题标题】:tcpdump piped through grep written to file. (Weird number 16)tcpdump 通过 grep 管道写入文件。 (奇怪的数字 16)
【发布时间】: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 UserUnix & 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


【解决方案1】:

问题是:我确实尝试让 tcpdump 行缓冲 -l 但我没有让 grep --line-buffered。这似乎确实可以解决问题。

这是我的第一个问题,直到下一个问题。如何使 sed 行缓冲。 我可以用 unbuffer 命令做到这一点。所以现在我是一个快乐的人。 感谢@A.B 的帮助。

edit:这确实有效。所以不要介意否决票。可能是其中一个不应该拥有电脑的愤怒孩子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2023-03-14
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多