我想执行这样的事情:
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
答案 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
本身也会有所帮助。