我正在尝试镜像 TCPDUMP 过滤器生成的 DNS 查询,并使用 dig 或任何其他实用程序重播它们

我正在尝试镜像 TCPDUMP 过滤器生成的 DNS 查询,并使用 dig 或任何其他实用程序重播它们

我根本不是一个经验丰富的脚本编写者。我确实找到了一些有用的提示,可以生成一个可以生成实时源的stdouttcpdump,这正是我想要的,问题在于处理输出并为实验室生成针对另一台 DNS 服务器的 dig/DNS 查询。

给我我想要的输出:

tcpdump -lvi any "udp port 53" 2>/dev/null|grep -E 'A\?'|awk '{print $(NF-1)}'

我尝试过将输出添加到数组中,但什么也没得到

declare -a testarr
testarr=( $(tcpdump -lvi any "udp port 53" 2>/dev/null|grep -E 'A\?'|awk '{print $(NF-1)}') )
echo ${testarr[@]}

我也尝试过

dig @1.1.1.1 $(tcpdump -lvi any "udp port 53" 2>/dev/null|grep -E 'A\?'|awk '{print $(NF-1)}')

任何帮助都将受到赞赏。

答案1

问题是,$()只有在tcpdump退出时才会返回,但在你的情况下它永远不会退出。你可以将输出重定向到xargs命令 - 它可以在退出dig之前运行tcpdump

示例代码:

tcpdump -nvi any "udp port 53" 2>/dev/null|awk '/A\?/{print $(NF-1);fflush()}' | xargs -n 1 dig @1.1.1.1 

还要注意,awk输出可以缓冲,因此您应该在awk程序中刷新输出。

相关内容