作为参数传递 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
本身也会有所帮助。
我想执行这样的操作:
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
本身也会有所帮助。