shell脚本tcpdump抓取数据解析执行关机指令
百度ai写了一个脚本
#!/bin/bash
# 组播监听关机脚本
# 功能:捕获特定组播数据包(53 48 55 54 44 4F 57 4E FF)时执行关机MCAST_GROUP="239.255.255.250"
MCAST_PORT=1900
SHUTDOWN_HEX="53 48 55 54 44 4F 57 4E FF"# 检查root权限
if [ "$(id -u)" -ne 0 ]; thenecho "请使用root权限运行此脚本" >&2exit 1
fi# 安装依赖
if ! command -v tcpdump &> /dev/null; thenecho "正在安装tcpdump..."apt-get install -y tcpdump || yum install -y tcpdump
fi# 主监听函数
start_monitoring() {echo "开始监听组播地址 ${MCAST_GROUP}:${MCAST_PORT}..."tcpdump -i any -X -nn "dst ${MCAST_GROUP} and udp port ${MCAST_PORT}" | \while read -r line; doif [[ $line =~ $SHUTDOWN_HEX ]]; thenecho "检测到关机指令!"shutdown -h nowexit 0fidone
}# 异常处理
trap 'echo "监听已停止"; exit 0' INT TERMstart_monitoring
结果发现抓不到数据,最终排查到tcpdump命令 "dst xxx"这里不需要,直接改用端口就行
tcpdump -i eth0 port ${MCAST_PORT} -X -nn
且测试时发现 用any任意端口有时正常,有时不正常,直接写网口名才行
且后面读取解析的数据也不行,百度了没有找到如何用tcpdump的输出数据做为read的读取输入
改用保存文件形式,且tcpdump命令不自动退出,只能手动退出。
后面查到用-c 又发现问题 -c 1> output.txt也有问题,直接提示tcpdump的用法,这里要写成
-c 1 > output.txt才行,
最终脚本写成
#!/bin/bash
# 组播监听关机脚本
# 功能:捕获特定组播数据包(53 48 55 54 44 4F 57 4E FF)时执行关机MCAST_GROUP="232.10.40.0"
MCAST_PORT=28000
FILE="output.txt"# 检查root权限
#if [ "$(id -u)" -ne 0 ]; then
# echo "请使用root权限运行此脚本" >&2
# exit 1
#fi# 安装依赖
#if ! command -v tcpdump &> /dev/null; then
# echo "正在安装tcpdump..."
# apt-get install -y tcpdump || yum install -y tcpdump
#fi# 主监听函数
start_monitoring() {echo "开始监听组播地址 ${MCAST_GROUP}:${MCAST_PORT}..."tcpdump -i eth0 port ${MCAST_PORT} -XX -nn -c 1 > $FILEcat $FILE
sleep 5grep "REBOOT" $FILE if [ $? -eq 0 ]; thenecho "检测到重启指令!"rebootexit 0elseecho "检测到关机指令!"shutdown -h nowexit 0fi
}# 异常处理
#trap 'echo "监听已停止"; exit 0' INT TERMstart_monitoring