原理是通过ping同一个总闸下,没有UPS的网络设备,ping 指定3个IP、每2分钟检测一次、连续3次全部不通则通过SSH自动关机。
- 飞牛系统开启SSH服务:打开飞牛fnOS面板 → 进入「设置」→ 找到「远程访问」/「SSH」→ 开启SSH(默认端口22);
- 青龙面板-依赖管理-创建依赖-node.js-名称‘ssh2’。
- 青龙面板-定时任务-创建任务-名称随便填一个,命令输入‘apk add sshpass’,手动运行-确定,手动运行一次,安装sshpass工具,运行完后删除这个任务即可
4.进入青龙面板 -「环境变量」→ 右上角「添加环境变量」。
第二个环境变量:
- 名称:SSH_PASS
- 值:你的飞牛普通用户登录密码(同时也是sudo密码,确保一致)
- 添加完成后,环境变量列表中会显示这2个参数,无需其他配置。

青龙面板-「脚本管理」-右上角「+」新建脚本-空文件-文件名‘feiniu_shutdown.sh’,编辑脚本,粘贴上以下内容
#!/bin/sh
# ================== 配置区 ==================
HOST="192.168.x.x" # 改成你的飞牛IP
PORT="22"
IP1="8.8.8.8"
IP2="1.1.1.1"
IP3="223.5.5.5"
need_fail=3 # 连续3次全不通
interval=120 # 2分钟一次
# ===========================================
USER="$SSH_USER"
PASS="$SSH_PASS"
# 自动把SSH密码传给sudo,免交互
SHUTDOWN_CMD="echo '${PASS}' | sudo -S shutdown -h now"
fail_count=0
echo "===== 飞牛断网关机守护 ====="
while true; do
ping -c 2 -W 2 "$IP1" >/dev/null 2>&1
p1=$?
ping -c 2 -W 2 "$IP2" >/dev/null 2>&1
p2=$?
ping -c 2 -W 2 "$IP3" >/dev/null 2>&1
p3=$?
if [ $p1 -ne 0 ] && [ $p2 -ne 0 ] && [ $p3 -ne 0 ]; then
fail_count=$((fail_count+1))
echo "[$(date '+%H:%M:%S')] 全部IP不通,连续失败 $fail_count 次"
else
fail_count=0
echo "[$(date '+%H:%M:%S')] 网络正常"
fi
if [ $fail_count -ge $need_fail ]; then
echo "连续3次不通,执行关机"
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no -p "$PORT" "$USER@$HOST" "$SHUTDOWN_CMD"
exit 0
fi
sleep $interval
done
修改HOST="192.168.x.x" # 改成你的飞牛IP,IP1="8.8.8.8",IP2="1.1.1.1",IP3="223.5.5.5"对应同一电闸下没有UPS的网络设备,如果没有这么多设备,可以删减下面对应的代码。
ping -c 2 -W 2 "$IP1" >/dev/null 2>&1
p1=$?
ping -c 2 -W 2 "$IP2" >/dev/null 2>&1
p2=$?
ping -c 2 -W 2 "$IP3" >/dev/null 2>&1
p3=$?
然后去定时任务添加任务名称‘断 电自动关机’,命令‘task feiniu_shutdown.sh’,定时类型‘开机运行’,确定,第一次需要运行一下,以后就不用管了,开机自动启动。
示例

另外如果你有钉钉机器人的话,也可以加上

脚本如下:
#!/bin/sh
# ================== 配置区 ==================
HOST="10.10.0.198" # 飞牛IP
PORT="22" # SSH端口
IP1="8.8.8.8"
IP2="1.1.1.1"
IP3="223.5.5.5"
need_fail=3 # 连续3次不通
interval=120 # 2分钟检测一次
# ===========================================
USER="$SSH_USER"
PASS="$SSH_PASS"
DING_URL="$DING_WEBHOOK"
SHUTDOWN_CMD="echo '${PASS}' | sudo -S shutdown -h now"
fail_count=0
echo "===== 飞牛断网自动关机守护 ====="
# 钉钉通知函数
send_ding() {
local text="$1"
curl -s -X POST \
-H "Content-Type: application/json" \
-d '{"msgtype":"text","text":{"content":"'"$text"'"},"at":{"isAtAll":false}}' \
"$DING_URL" >/dev/null 2>&1
}
while true; do
ping -c 2 -W 2 "$IP1" >/dev/null 2>&1
p1=$?
ping -c 2 -W 2 "$IP2" >/dev/null 2>&1
p2=$?
ping -c 2 -W 2 "$IP3" >/dev/null 2>&1
p3=$?
if [ $p1 -ne 0 ] && [ $p2 -ne 0 ] && [ $p3 -ne 0 ]; then
fail_count=$((fail_count+1))
echo "[$(date '+%H:%M:%S')] 全部IP不通,连续失败 $fail_count 次"
else
fail_count=0
echo "[$(date '+%H:%M:%S')] 网络正常"
fi
# 连续3次不通 → 发通知 → 关机
if [ $fail_count -ge $need_fail ]; then
echo "连续3次不通,准备关机..."
# 发送钉钉通知
send_ding "⚠️ 飞牛断网告警
连续3次检测全部IP不通
即将执行自动关机
主机:$HOST
时间:$(date '+%Y-%m-%d %H:%M:%S')"
echo "钉钉通知已发送,3秒后关机..."
sleep 3
# 执行关机
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no -p $PORT $USER@$HOST "$SHUTDOWN_CMD"
echo "已关机,脚本退出"
exit 0
fi
sleep $interval
done
添加环境变量‘DING_WEBHOOK’=钉钉机器人webhook。