百度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 ]; 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 any -X -nn "dst ${MCAST_GROUP} and udp port ${MCAST_PORT}" | \
while read -r line; do
if [[ $line =~ $SHUTDOWN_HEX ]]; then
echo "检测到关机指令!"
shutdown -h now
exit 0
fi
done
}
# 异常处理
trap 'echo "监听已停止"; exit 0' INT TERM
start_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 > $FILE
cat $FILE
sleep 5
grep "REBOOT" $FILE
if [ $? -eq 0 ]; then
echo "检测到重启指令!"
reboot
exit 0
else
echo "检测到关机指令!"
shutdown -h now
exit 0
fi
}
# 异常处理
#trap 'echo "监听已停止"; exit 0' INT TERM
start_monitoring
3630

被折叠的 条评论
为什么被折叠?



