diff --git a/xu1 b/xu1 index f3a74c3..421dc8e 100644 --- a/xu1 +++ b/xu1 @@ -1,12 +1,12 @@ #!/bin/bash # ========================================== -# 标题:X-UI 终极自动安装脚本 (咸V咆哮·物理拔线版) +# 标题:X-UI 终极自动安装脚本 (咸V咆哮·物理拔线+真实校验版) # 特性: -# 1. 内核级 timeout 强制熔断,彻底解决 TCP 假死/DNS 阻塞导致的四五分钟漫长等待。 -# 2. 15秒生死线:连不上瞬间强杀进程切换,绝不拖泥带水。 -# 3. 强制全网 IPv4 协议,规避 IPv6 路由黑洞。 -# 4. 直链 + GitHub 公益镜像节点双源自动灾备切换。 +# 1. 禁用多线程工具空间预分配,彻底解决空壳文件欺骗。 +# 2. 引入 tar 内部结构模拟解压校验,100% 杜绝损坏包。 +# 3. 15秒生死线:连不上瞬间强杀进程切换。 +# 4. 强制全网 IPv4,规避 IPv6 路由黑洞。 # ========================================== # --- 颜色配置 --- @@ -30,50 +30,51 @@ gen_random_string() { echo $(LC_ALL=C tr -dc 'a-zA-Z0-9' /dev/null 2>&1; then return 0; fi + elif [ "$file_type" == "db" ]; then + # 数据库包校验大小即可,要求大于 10KB local file_size=$(du -k "$file" | cut -f1) - if [ "$file_size" -ge "$min_size" ]; then - return 0 - fi + if [ "$file_size" -ge 10 ]; then return 0; fi fi - rm -f "$file" + + rm -f "$file" "$file.aria2" # 假包直接干掉 return 1 } - echo -e "${Yellow} -> 方案一:Aria2 (内核级15秒强杀)...${Font}" + echo -e "${Yellow} -> 方案一:Aria2 (禁止预分配/15秒强杀)...${Font}" if command -v aria2c >/dev/null; then - timeout 15 aria2c -x 4 -s 4 --connect-timeout=5 --timeout=5 --max-tries=1 --disable-ipv6=true --user-agent="$FAKE_UA" --allow-overwrite=true --dir="$(dirname "$file")" --out="$(basename "$file")" "$url" >/dev/null 2>&1 - check_file_valid && return 0 + # 加入 --file-allocation=none 解决空壳文件 Bug + timeout 15 aria2c -x 4 -s 4 --file-allocation=none --connect-timeout=5 --timeout=5 --max-tries=1 --disable-ipv6=true --user-agent="$FAKE_UA" --allow-overwrite=true --dir="$(dirname "$file")" --out="$(basename "$file")" "$url" >/dev/null 2>&1 + check_valid && return 0 fi - echo -e "${Yellow} -> 方案二:Axel (内核级15秒强杀)...${Font}" - if command -v axel >/dev/null; then - timeout 15 axel -4 -n 4 -T 5 -U "$FAKE_UA" -o "$file" "$url" >/dev/null 2>&1 - check_file_valid && return 0 - fi - - echo -e "${Yellow} -> 方案三:Wget (内核级15秒强杀)...${Font}" + echo -e "${Yellow} -> 方案二:Wget (强制IPv4/15秒强杀)...${Font}" timeout 15 wget -4 --no-check-certificate --user-agent="$FAKE_UA" -T 5 -t 1 -O "$file" "$url" >/dev/null 2>&1 - check_file_valid && return 0 + check_valid && return 0 - echo -e "${Yellow} -> 方案四:Curl (内核级15秒强杀)...${Font}" + echo -e "${Yellow} -> 方案三:Curl (强力降级/15秒强杀)...${Font}" timeout 15 curl -4 --http1.1 -L -k -A "$FAKE_UA" --connect-timeout 5 -m 15 --retry 1 -o "$file" "$url" >/dev/null 2>&1 - check_file_valid && return 0 + check_valid && return 0 if [[ -n "$fallback_url" ]]; then - echo -e "${Red}!! 警告:直链节点全军覆没!启用方案五:GitHub 加速镜像池兜底 !!${Font}" - timeout 25 wget -4 --no-check-certificate --user-agent="$FAKE_UA" -T 10 -t 2 -O "$file" "$fallback_url" >/dev/null 2>&1 - check_file_valid && return 0 + echo -e "${Red}!! 警告:直链节点全军覆没!启用方案四:GitHub 加速镜像池兜底 !!${Font}" + timeout 30 wget -4 --no-check-certificate --user-agent="$FAKE_UA" -T 10 -t 2 -O "$file" "$fallback_url" >/dev/null 2>&1 + check_valid && return 0 fi return 1 @@ -128,10 +129,10 @@ fi echo -e "${Yellow}>> [2/7] 正在安装极速下载器与必备依赖...${Font}" if command -v apt-get >/dev/null; then apt-get update -y -q >/dev/null 2>&1 - apt-get install -y -q aria2 axel wget curl tar tzdata socat ca-certificates sqlite3 bc coreutils >/dev/null 2>&1 + apt-get install -y -q aria2 wget curl tar tzdata socat ca-certificates sqlite3 bc coreutils >/dev/null 2>&1 elif command -v yum >/dev/null; then yum install -y -q epel-release >/dev/null 2>&1 - yum install -y -q aria2 axel wget curl tar tzdata socat ca-certificates sqlite3 bc coreutils >/dev/null 2>&1 + yum install -y -q aria2 wget curl tar tzdata socat ca-certificates sqlite3 bc coreutils >/dev/null 2>&1 fi SERVER_IP=$(curl -s4m5 api.ipify.org) @@ -165,18 +166,15 @@ rm -rf /usr/local/x-ui mkdir -p /usr/local/ cd /usr/local/ -if ! download_file "$DOWNLOAD_URL" "$FILE_NAME" "$FALLBACK_URL"; then +# 注意这里多传了一个参数 "tar",要求它做模拟解压校验 +if ! download_file "$DOWNLOAD_URL" "$FILE_NAME" "$FALLBACK_URL" "tar"; then echo -e "${Red}!! 终极下载彻底失败:连加速镜像池也挂了,请检查服务器是否能连接外网 !!${Font}" exit 1 fi -echo -e "${Green}✓ 核心程序下载成功,大小校验通过!${Font}" - -if ! tar -tzf "$FILE_NAME" >/dev/null 2>&1; then - echo -e "${Red}!! 文件解压失败,可能是包损坏,请重试 !!${Font}" - exit 1 -fi +echo -e "${Green}✓ 核心程序下载成功,模拟解压校验通过!${Font}" +# 既然上面模拟解压过了,这里100%不会报错 tar zxvf "$FILE_NAME" >/dev/null rm -f "$FILE_NAME" cd x-ui @@ -223,14 +221,8 @@ if [ "$INSTALL_MODE" == "1" ]; then else echo -e "${Green}✓ 模式二:拉取自定义数据库...${Font}" - rm -f "$DB_PATH" - if command -v aria2c >/dev/null; then - timeout 15 aria2c -x 4 -s 4 --connect-timeout=5 --disable-ipv6=true --user-agent="$FAKE_UA" --allow-overwrite=true --dir="$(dirname "$DB_PATH")" --out="$(basename "$DB_PATH")" "$DB_URL" >/dev/null 2>&1 - else - timeout 15 wget -4 --no-check-certificate --user-agent="$FAKE_UA" -T 5 -t 1 -O "$DB_PATH" "$DB_URL" >/dev/null 2>&1 - fi - - if [ ! -s "$DB_PATH" ]; then + # 数据库拉取,传参 "db" 要求校验大小即可 + if ! download_file "$DB_URL" "$DB_PATH" "" "db"; then echo -e "${Red}警告:自定义数据库下载失败,退回初始状态!${Font}" cp $INSTALL_PATH/bin/x-ui.db "$DB_PATH" fi @@ -340,4 +332,4 @@ echo -e "面板端口 : ${Green}${CONFIG_PORT}${Font}" echo -e "安全路径 : ${Green}/${CONFIG_PATH}/${Font}" echo -e "${Blue}══════════════════════════════════════════════════${Font}" echo -e "${Yellow}⚠ 强烈建议:请立即保存上方的信息!${Font}" -echo -e "${Yellow}⚠ 日常管理:在终端输入 x-ui 即可呼出管理菜单。${Font}" \ No newline at end of file +echo -e "${Yellow}⚠ 日常管理:在终端输入 x-ui 即可呼出管理菜单。${Font}" \ No newline at end of file