如何用Bash接收带源地址与端口的UDP报文负载?
监听UDP报文并提取源IP、端口及负载的Bash方案
问题背景
需要监听指定UDP端口(如8787)的所有报文,要求获取每个报文的源IP地址、源端口和文本负载,且必须用Bash脚本实现。此前尝试的工具存在缺陷:
ncat -ul 8787:只能接收单一来源的报文,且不输出源信息tcpdump相关命令:要么无法显示负载,要么输出冗余过多难以解析
可行方案
方案1:使用socat(推荐)
socat是功能强大的网络工具,能完美处理UDP多来源报文,且可直接输出源信息和负载。
先安装socat(部分系统默认已预装):
# Debian/Ubuntu系 apt-get install socat # RHEL/CentOS系 yum install socat
执行监听并输出所需信息的命令:
socat -u UDP-RECVFROM:8787,fork EXEC:'bash -c "echo -n \$SOCAT_SENDER:\$SOCAT_SENDER_PORT:; cat"'
-u:启用单向接收模式UDP-RECVFROM:8787,fork:监听8787端口,fork参数保证能同时处理多个来源的报文EXEC:触发bash命令,通过socat自动设置的环境变量SOCAT_SENDER和SOCAT_SENDER_PORT获取源IP和端口,再用cat读取并输出文本负载
输出示例:
192.168.1.100:54321:Hello World 10.0.0.5:12345:Test UDP Message
方案2:改进tcpdump输出,用awk过滤解析
如果无法安装socat,可以通过调整tcpdump参数,配合awk提取关键信息:
tcpdump -lnn -A -s 0 udp port 8787 2>/dev/null | awk ' /IP [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ >/ { split($3, src, /\./); src_ip = src[1]"."src[2]"."src[3]"."src[4]; src_port = src[5]; printf "%s:%s:", src_ip, src_port; } /^[[:print:]]+$/ { print $0 } '
tcpdump -lnn -A -s 0:-lnn关闭反向解析、显示数字端口;-A输出ASCII格式的负载;-s 0捕获完整报文内容- awk脚本:匹配IP报文行提取源IP和端口,再匹配纯可打印字符行输出负载文本
方案3:netcat结合循环监听(备选)
利用nc的UDP监听功能,配合bash循环实现多来源接收(兼容性较差,仅适合无socat的环境):
while true; do nc -ul 8787 | while read -r line; do # 通过ss命令获取当前UDP连接的源信息 src_info=$(ss -u dst :8787 | grep -v "State" | awk '{print $5}') echo "$src_info:$line" done done
注意:
ss命令返回的源信息可能包含多个连接,需根据实际场景调整过滤逻辑。
内容的提问来源于stack exchange,提问作者Shodan
相关产品推荐
相关产品推荐

