传递为参数tcpdump输出

时间:2015-04-02 07:35:52

标签: bash tcpdump

我想执行这样的事情:

sudo tcpdump -n dst port 40010 -X

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

收到的

和foreach数据包执行read.sh

就像

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

或者

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

1 个答案:

答案 0 :(得分:0)

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

tcpdump | script

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

基于简短的实验,以下内容应该有效:

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

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