作为参数传递 tcpdump 输出

pass as parameter tcpdump output

我想执行这样的操作:

sudo tcpdump -n dst port 40010 -X

将收到的每个数据包传递到 bash 文件 read.sh

并为收到的每个数据包执行read.sh

就像

sudo bash read.sh -y (tcpdump -n dst port 40010 -X)

tcpdump -n dst port 40010 -X > read.sh

将输出从一个命令传递到另一个命令的一般方法是管道。

tcpdump | script

但是,这将导致 script 接收连续的输出流,一次一行。 tcpdump 的输出将一个数据包分成几行,因此如果 script 假设它将接收一个数据包,您将需要以某种方式解析输出。

根据简短的实验,类似以下的方法应该有效:

tcpdump -n dst port 40010 -X |
awk '/^[0-9]/ &&  != "packets" {
        if (p) { print p | "script"; close("script"); } p=[=11=] }
    /^[ \t]/ { p=p "\n" [=11=] }
    END { if(p) print p | "script" }'

另一个怪癖是按 ctrl-C 将终止整个管道,因此您将完全丢失最后几个数据包。我通过使用 -c 指定多个数据包来避免这种情况,但您也可以通过 运行 使用 trap 来阻止信号来保护 Awk 脚本。但是,在这一点上,我可能会考虑切换到 Python 之类的。当然,将数据包拆分合并到 script 本身也会有所帮助。