#!/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
哪个大佬看看有没有问题。
评论 (0)