更新 xu1

This commit is contained in:
2026-03-01 21:07:08 +08:00
parent 2b56b07f28
commit e50cfeb0b2

88
xu1
View File

@@ -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/urandom | fold -w "$length" | head -n 1)
}
# 终极物理拔线下载引擎 (利用 timeout 命令强杀假死进程)
# 终极物理拔线 + 真实结构校验下载引擎
download_file() {
local url=$1
local file=$2
local fallback_url=$3
local min_size=1000
local file_type=$4 # 区分是 tar 包还是 db 数据库
rm -f "$file"
rm -f "$file" "$file.aria2"
check_file_valid() {
if [ -f "$file" ]; then
# 核心:暴力校验文件真实性
check_valid() {
if [ ! -f "$file" ]; then return 1; fi
if [ "$file_type" == "tar" ]; then
# 模拟解压校验:如果是个假包或者空壳,这句直接报错返回 1
if tar -tzf "$file" >/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}"
echo -e "${Yellow}⚠ 日常管理:在终端输入 x-ui 即可呼出管理菜单。${Font}"