2015-04-02 81 views
0

我要执行这样的事情:通作为参数的tcpdump输出

sudo tcpdump -n dst port 40010 -X 

通过每个包内收到来砸文件read.sh

和foreach接收的分组执行read.sh

这是像

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

或者

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

回答

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本身也会有所帮助。

+0

在20-24包本身......哪里是在蓄能“脚本”包中的命令停止? – Ratiess 2015-04-02 08:42:38

+0

它是从标准输入中读取的,一次只能读取一个数据包。真的,'脚本'内部发生的事情取决于你。 – tripleee 2015-04-02 08:53:19

+0

它的工作原理,非常感谢! – Ratiess 2015-04-02 10:50:13