From b7988dc666cf1c2c730f98b3fa286d4760f7f1e2 Mon Sep 17 00:00:00 2001 From: hotyue <52734432+hotyue@users.noreply.github.com> Date: Fri, 10 Apr 2026 14:12:49 +0000 Subject: [PATCH] =?UTF-8?q?fix(install):=20=E5=BC=95=E5=85=A5=E5=A4=9A?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E9=9B=B7=E8=BE=BE=E5=AE=B9=E7=81=BE=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=8F=8C=E6=A0=88=20IP=20?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=95=B0=E7=BB=84=E4=BA=A4=E4=BA=92=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=20(v3.0.1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/install.sh | 72 ++++++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/core/install.sh b/core/install.sh index 0569200..93da6ed 100755 --- a/core/install.sh +++ b/core/install.sh @@ -161,36 +161,54 @@ if [[ "$TG_CHOICE" =~ ^[Yy]$ ]]; then [ -n "$INPUT_PORT" ] && AGENT_PORT="$INPUT_PORT" fi -# ================== [v3.0.1新增修改 1: 网络栈探测与锚点锁定] ================== -echo -e "\n[4.5/7] 正在探测本机网络栈与可用出口..." -DETECT_V4=$(curl -4 -s -m 3 api.ip.sb/ip | tr -d '[:space:]') -DETECT_V6=$(curl -6 -s -m 3 api.ip.sb/ip | tr -d '[:space:]') +# ================== [v3.0.1新增修改 1: 冗余网络栈探测与锚点锁定] ================== +echo -e "\n\033[36m[4.5/7] 正在探测本机网络栈与可用出口 (多节点雷达扫描中)...\033[0m" -DEFAULT_IP="" -IP_PREF="4" -if [ -n "$DETECT_V4" ]; then - DEFAULT_IP="$DETECT_V4"; IP_PREF="4" -elif [ -n "$DETECT_V6" ]; then - DEFAULT_IP="$DETECT_V6"; IP_PREF="6" +# 引入容灾机制:依次尝试三个不同的 API,拿到有效的 IP 格式就停止 +DETECT_V4=$( (curl -4 -s -m 3 api.ip.sb/ip || curl -4 -s -m 3 ifconfig.me || curl -4 -s -m 3 ipv4.icanhazip.com) 2>/dev/null | grep -E "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | head -n 1 | tr -d '[:space:]') +DETECT_V6=$( (curl -6 -s -m 3 api.ip.sb/ip || curl -6 -s -m 3 ifconfig.me || curl -6 -s -m 3 ipv6.icanhazip.com) 2>/dev/null | grep -E "^[0-9a-fA-F:]+.*:" | head -n 1 | tr -d '[:space:]') + +# 构建动态选项数组 +IP_OPTIONS=() +IP_PROTO=() + +[[ -n "$DETECT_V4" ]] && { IP_OPTIONS+=("$DETECT_V4"); IP_PROTO+=("4"); } +[[ -n "$DETECT_V6" ]] && { IP_OPTIONS+=("$DETECT_V6"); IP_PROTO+=("6"); } + +if [ ${#IP_OPTIONS[@]} -eq 0 ]; then + echo -e "\033[33m⚠️ 雷达受阻:未能自动探测到公网 IP,请手动指定。\033[0m" + read -p "请输入您要绑定的公网 IP (v4 或 v6): " PUBLIC_IP + [[ "$PUBLIC_IP" == *":"* ]] && IP_PREF="6" || IP_PREF="4" +else + echo "📍 发现可用出口 IP,请选择要注册与养护的锚点:" + for i in "${!IP_OPTIONS[@]}"; do + num=$((i+1)) + if [ "${IP_PROTO[$i]}" == "4" ]; then + echo " $num) 🌐 IPv4: ${IP_OPTIONS[$i]} (默认选项)" + else + echo " $num) 🌌 IPv6: ${IP_OPTIONS[$i]}" + fi + done + CUSTOM_OPT=$(( ${#IP_OPTIONS[@]} + 1 )) + echo " $CUSTOM_OPT) ✍️ 手动指定其他 IP (适合多 IP 站群机)" + + read -p "请输入选择 (默认1): " IP_CHOICE + IP_CHOICE=${IP_CHOICE:-1} + + if [ "$IP_CHOICE" -le "${#IP_OPTIONS[@]}" ] && [ "$IP_CHOICE" -gt 0 ]; then + idx=$((IP_CHOICE-1)) + PUBLIC_IP="${IP_OPTIONS[$idx]}" + IP_PREF="${IP_PROTO[$idx]}" + elif [ "$IP_CHOICE" -eq "$CUSTOM_OPT" ]; then + read -p "请输入您要绑定的公网 IP (v4 或 v6): " PUBLIC_IP + [[ "$PUBLIC_IP" == *":"* ]] && IP_PREF="6" || IP_PREF="4" + else + # 兜底:乱输就默认选第一个 + PUBLIC_IP="${IP_OPTIONS[0]}" + IP_PREF="${IP_PROTO[0]}" + fi fi -echo -e "\033[36m📍 发现可用出口 IP,请选择要注册与养护的锚点:\033[0m" -echo " 1) 🤖 智能默认 (推荐,首选可用IP: ${DEFAULT_IP:-获取失败})" -[[ -n "$DETECT_V4" ]] && echo " 2) 🌐 强制锁定 IPv4 ($DETECT_V4)" -[[ -n "$DETECT_V6" ]] && echo " 3) 🌌 强制锁定 IPv6 ($DETECT_V6)" -echo " 4) ✍️ 手动指定 (适合站群机,手动输入特定 IP)" - -read -p "请输入选择 (默认1): " IP_CHOICE -case "${IP_CHOICE:-1}" in - 2) PUBLIC_IP="$DETECT_V4"; IP_PREF="4" ;; - 3) PUBLIC_IP="$DETECT_V6"; IP_PREF="6" ;; - 4) - read -p "请输入您要绑定的公网 IP (v4 或 v6): " PUBLIC_IP - [[ "$PUBLIC_IP" == *":"* ]] && IP_PREF="6" || IP_PREF="4" - ;; - *) PUBLIC_IP="$DEFAULT_IP" ;; -esac - # 终极修复:为 IPv6 自动穿上防护装甲(方括号),解决 Master 拼接 URL 报错问题 if [[ "$PUBLIC_IP" == *":"* ]] && [[ "$PUBLIC_IP" != *"["* ]]; then BIND_IP="[${PUBLIC_IP}]"