From ec7bf0f2b96052e4d20997e151c8bb3f641c368a Mon Sep 17 00:00:00 2001 From: hotyue <52734432+hotyue@users.noreply.github.com> Date: Sun, 26 Apr 2026 05:47:34 +0000 Subject: [PATCH] =?UTF-8?q?fix(core):=20=E9=87=8D=E6=9E=84=E5=A3=B0?= =?UTF-8?q?=E5=91=90=E6=8E=A2=E9=92=88=E6=8B=89=E5=8F=96=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=BC=95=E5=85=A5=E5=8F=8C=E6=A0=88=E6=99=BA=E8=83=BD=E5=AE=B9?= =?UTF-8?q?=E7=81=BE=EF=BC=8C=E5=B9=B6=E5=A2=9E=E5=8A=A0=E5=BA=94=E5=AF=B9?= =?UTF-8?q?=20WARP=20=E5=A4=8D=E6=9D=82=E8=B7=AF=E7=94=B1=E6=AD=BB?= =?UTF-8?q?=E9=94=81=E7=9A=84=E8=84=B1=E5=A3=B3=E6=8A=A2=E6=95=91=E6=9C=BA?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/mod_quality.sh | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/core/mod_quality.sh b/core/mod_quality.sh index 3681e40..8529fba 100755 --- a/core/mod_quality.sh +++ b/core/mod_quality.sh @@ -31,28 +31,40 @@ fi # 补齐协议版本参数 (-4 或 -6) PROBE_ARGS+=("-${DYNAMIC_IP_PREF}") -# 2. 静默拉取原始数据 (消除短链接 RCE 劫持风险,收编为本地固化执行) +# 2. 静默拉取原始数据 (智能双重容灾: 官方主干优先防 RCE,短链双栈兜底纯 V6) PROBE_SCRIPT="/opt/ip_sentinel/core/ip_probe.sh" -if [ ! -x "$PROBE_SCRIPT" ]; then - # 若本地探针尚未就绪,直接从 GitHub 官方主干拉取底层源码,绕过未知域名 - curl -sL "https://raw.githubusercontent.com/xykt/IPQuality/main/ip.sh" -o "$PROBE_SCRIPT" 2>/dev/null + +# [修复] 采用 -s 检查文件是否大于0字节,防止遗留 0 字节废弃文件 +if [ ! -s "$PROBE_SCRIPT" ]; then + # 🛡️ 首选防线: 从 GitHub 官方拉取,杜绝短链 RCE 劫持风险 + curl -sL -m 10 "https://raw.githubusercontent.com/xykt/IPQuality/main/ip.sh" -o "$PROBE_SCRIPT" 2>/dev/null + + # 🚑 容灾防线: 如果拉取失败 (如纯 V6 机器无法解析 GitHub),回退到 Cloudflare 双栈短链兜底 + if [ ! -s "$PROBE_SCRIPT" ]; then + curl -sL -m 10 "https://IP.Check.Place" -o "$PROBE_SCRIPT" 2>/dev/null + fi chmod +x "$PROBE_SCRIPT" 2>/dev/null fi -# 采用本地原生执行,拥抱底层路由的真实结果 -RAW_OUTPUT=$(timeout 180 bash "$PROBE_SCRIPT" "${PROBE_ARGS[@]}" 2>/dev/null) +# 封装打靶与清洗逻辑为函数,便于后续容灾重试 +execute_probe() { + RAW_OUTPUT=$(timeout 180 bash "$PROBE_SCRIPT" "$@" 2>/dev/null) + JSON_DATA="{${RAW_OUTPUT#*\{}" + ESC=$(printf '\033') + JSON_DATA=$(printf "%s" "$JSON_DATA" | sed -e "s/${ESC}\[[0-9;]*[a-zA-Z]//g" -e "s/${ESC}[0-9;]*[a-zA-Z]//g" -e "s/x1b\\[[0-9;]*[a-zA-Z]//g" -e "s/x1b[0-9;]*[a-zA-Z]//g") + IP_ADDR=$(echo "$JSON_DATA" | jq -r '.Head.IP // empty' 2>/dev/null) +} -# 2. 极致截取 JSON (无视开头的赞助商广告与不可见字符,精准提取) -JSON_DATA="{${RAW_OUTPUT#*\{}" +# 🚀 首轮实弹打靶 (带有物理网卡 BIND_IP 枷锁) +execute_probe "${PROBE_ARGS[@]}" -# [v4.0.3 核心抢修: 强力去污粉] 专门针对 Alpine/Busybox 等轻量级环境! -# 底层探测脚本的正则去色在 Alpine 上会失效,导致 ANSI 控制符混入 JSON。 -# 必须在此处彻底清洗真实的 ESC 字符与字面量 x1b,否则会导致 TG API 静默拒收! -ESC=$(printf '\033') -JSON_DATA=$(printf "%s" "$JSON_DATA" | sed -e "s/${ESC}\[[0-9;]*[a-zA-Z]//g" -e "s/${ESC}[0-9;]*[a-zA-Z]//g" -e "s/x1b\\[[0-9;]*[a-zA-Z]//g" -e "s/x1b[0-9;]*[a-zA-Z]//g") - -# 2. 提取基础物理定位与身份特征 (兼作合法性校验) -IP_ADDR=$(echo "$JSON_DATA" | jq -r '.Head.IP // empty' 2>/dev/null) +# 🚑 [容灾防线] 剥离枷锁抢救机制 +# 如果打靶失败 (无 IP 回波),且身上带着 -i 枷锁,极大概率是复杂路由 (如 WARP) 导致的死锁! +if [ -z "$IP_ADDR" ] && [[ "${PROBE_ARGS[*]}" == *"-i"* ]]; then + # 卸下 -i 物理枷锁,交由系统内核自主寻找最优路由,进行第二次抢救性探测 + FALLBACK_ARGS=("-y" "-j" "-f" "-${DYNAMIC_IP_PREF}") + execute_probe "${FALLBACK_ARGS[@]}" +fi if [ -z "$IP_ADDR" ]; then curl -s -X POST "${TG_API_URL}" \