You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:32:53