#!/bin/bash# --- 配置 ---# Ping 的目标地址 (使用IPv4地址确保测试IPv4连通性)TARGET="1.1.1.1"# Ping 的次数COUNT=5# 每次循环后等待的秒数SLEEP_INTERVAL=10# 最大重试次数 (避免无限循环)MAX_RETRY=3# --- 锁文件配置 ---LOCK_FILE="/tmp/$(basename $0).lock"# --- 日志颜色配置 ---GREEN="\033[0;32m"RED="\033[0;31m"YELLOW="\033[1;33m"BLUE="\033[0;34m"NC="\033[0m" # No Color# --- 进程锁检查 ---if [ -e "$LOCK_FILE" ]; then    log_message="脚本已在运行中,本次执行自动退出。锁文件: ${LOCK_FILE}"    echo -e "${YELLOW}${log_message}${NC}"    logger "${log_message}"    exit 1fi# --- 设置陷阱,确保脚本退出时删除锁文件 ---trap 'rm -f "$LOCK_FILE"; echo -e "${BLUE}清理锁文件并退出${NC}"' EXIT# --- 创建锁文件 ---touch "$LOCK_FILE"# --- 函数:检测IPv4连通性 ---check_ipv4_connectivity() {    # 使用ping测试IPv4连通性,超时设置为3秒    if ping -4 -q -c ${COUNT} -W 3 ${TARGET} &>/dev/null; then        return 0  # 连通    else        return 1  # 不通    fi}# --- 函数:获取丢包率 ---get_loss_rate() {    local loss=$(ping -4 -q -c ${COUNT} -W 3 ${TARGET} 2>/dev/null | grep -oP '\d+(?=% packet loss)')    if [ -z "$loss" ]; then        echo "100"    else        echo "$loss"    fi}# --- 函数:重新获取WARP v4出口 ---reset_warp_v4() {    echo -e "${YELLOW}正在重新获取WARP v4出口...${NC}"        # 执行你提供的命令来重置WARP v4出口    wg-quick down warp &>/dev/null    sed -i "s/Endpoint.*/Endpoint = engage.cloudflareclient.com:4500/" /etc/wireguard/warp.conf    warp o &>/dev/null        # 等待一段时间让连接稳定    sleep 5        echo -e "${BLUE}WARP v4出口重置完成${NC}"}# --- 函数:检查是否为root用户 ---check_root() {    if [ "$EUID" -ne 0 ]; then        echo -e "${RED}错误: 此脚本需要root权限才能执行${NC}"        echo -e "${YELLOW}请使用: sudo $0${NC}"        exit 1    fi}# --- 主程序 ---echo -e "${GREEN}===============================================${NC}"echo -e "${GREEN}     WARP IPv4出口自动恢复脚本启动${NC}"echo -e "${GREEN}===============================================${NC}"# 检查root权限check_rootlog_message_start="开始执行WARP IPv4连通性检测..."echo -e "${GREEN}${log_message_start}${NC}"logger "${log_message_start}"retry_count=0# 首次检查连通性if check_ipv4_connectivity; then    loss=$(get_loss_rate)    log_message="[丢包率 ${loss}%] IPv4网络连通正常,无需处理"    echo -e "${GREEN}${log_message}${NC}"    logger "${log_message}"    exit 0fi# 如果首次检查失败,开始重试循环while [ $retry_count -lt $MAX_RETRY ]; do    retry_count=$((retry_count + 1))    loss=$(get_loss_rate)        log_message="[第${retry_count}次重试] [丢包率 ${loss}%] IPv4网络中断,正在重新获取WARP v4出口..."    echo -e "${RED}${log_message}${NC}"    logger "${log_message}"        # 重置WARP v4出口    reset_warp_v4        # 等待网络稳定    log_message_wait="等待 ${SLEEP_INTERVAL} 秒让网络稳定,然后重新检测..."    echo -e "${YELLOW}${log_message_wait}${NC}"    sleep ${SLEEP_INTERVAL}        # 重新检查连通性    if check_ipv4_connectivity; then        loss=$(get_loss_rate)        log_message_success="[丢包率 ${loss}%] IPv4网络已恢复正常!"        echo -e "${GREEN}${log_message_success}${NC}"        logger "${log_message_success}"        echo -e "${GREEN}===============================================${NC}"        echo -e "${GREEN}     脚本执行完毕,网络已恢复${NC}"        echo -e "${GREEN}===============================================${NC}"        exit 0    fidone# 如果达到最大重试次数仍未恢复log_message_failed="已达到最大重试次数(${MAX_RETRY}),IPv4网络仍未恢复,请手动检查WARP配置"echo -e "${RED}${log_message_failed}${NC}"logger "${log_message_failed}"echo -e "${RED}===============================================${NC}"echo -e "${RED}     脚本执行完毕,网络未能恢复${NC}"echo -e "${RED}===============================================${NC}"exit 1

使用方法

保存脚本:

bashsudo nano /usr/local/bin/warp-monitor.sh

将脚本内容粘贴进去,然后保存退出

设置执行权限:

bashsudo chmod +x /usr/local/bin/warp-monitor.sh

手动测试:

bashsudo /usr/local/bin/warp-monitor.sh

设置定时任务(可选):

bashsudo crontab -e

添加以下行,每5分钟检查一次

*/5 * * * * /usr/local/bin/warp-monitor.sh >/dev/null 2>&1

看了这两个老哥的帖子结合ai搞的:
https://www.nodeseek.com/post-418493-1
https://www.nodeseek.com/post-419542-1

哪个大佬看看有没有问题。