收起左侧

飞牛不支持的UPS通过青龙面板执行断 电关机

0
回复
41
查看
[ 复制链接 ]

5

主题

9

回帖

0

牛值

江湖小虾

原理是通过ping同一个总闸下,没有UPS的网络设备,ping 指定3个IP、每2分钟检测一次、连续3次全部不通则通过SSH自动关机。

  1. 飞牛系统开启SSH服务:打开飞牛fnOS面板 → 进入「设置」→ 找到「远程访问」/「SSH」→ 开启SSH(默认端口22);
  2. 青龙面板-依赖管理-创建依赖-node.js-名称‘ssh2’。
  3. 青龙面板-定时任务-创建任务-名称随便填一个,命令输入‘apk add sshpass’,手动运行-确定,手动运行一次,安装sshpass工具,运行完后删除这个任务即可

4.进入青龙面板 -「环境变量」→ 右上角「添加环境变量」。

  • 名称:SSH_USER
  • 值:你的飞牛普通用户名

第二个环境变量:

  • 名称:SSH_PASS
  • 值:你的飞牛普通用户登录密码(同时也是sudo密码,确保一致)
  1. 添加完成后,环境变量列表中会显示这2个参数,无需其他配置。

image-20260410161445831

青龙面板-「脚本管理」-右上角「+」新建脚本-空文件-文件名‘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’,定时类型‘开机运行’,确定,第一次需要运行一下,以后就不用管了,开机自动启动。

image-20260410162532951

示例

image-20260410164614102

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

image-20260410164203076

脚本如下:

#!/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。

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则