Files
dock/xu
2025-12-22 14:48:26 +08:00

258 lines
8.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# ==========================================
# 标题咸v咆哮制作 - X-UI 全能增强版安装脚本
# 功能:智能包校验、三重配置写入、双重启动保险
# ==========================================
# --- 颜色配置 ---
Red="\033[31m"
Green="\033[32m"
Yellow="\033[33m"
Blue="\033[36m"
Font="\033[0m"
# --- 核心变量配置 ---
BASE_URL="https://freeyx.vps3344.dpdns.org/xui"
INSTALL_PATH="/usr/local/x-ui"
DB_PATH="/etc/x-ui/x-ui.db"
SET_USER="3344"
SET_PASS="3344"
SET_PORT="8443"
# ==========================================
# 1. 霸气开场
# ==========================================
clear
echo -e "${Blue}#################################################${Font}"
echo -e "${Blue}# #${Font}"
echo -e "${Blue}# 咸v咆哮制作 #${Font}"
echo -e "${Blue}# X-UI 自动安装脚本 (增强版) #${Font}"
echo -e "${Blue}# #${Font}"
echo -e "${Blue}#################################################${Font}"
sleep 2
# 检查 Root 权限
if [[ $EUID -ne 0 ]]; then
echo -e "${Red}错误:大哥,请用 root 身份运行此脚本!${Font}"
exit 1
fi
# ==========================================
# 2. 系统环境与架构检测 + 基础软件更新
# ==========================================
echo -e "${Yellow}>> 正在更新系统并安装必要工具 (curl, wget, tar, sqlite3)...${Font}"
# 自动识别系统并更新
if [[ -f /etc/redhat-release ]]; then
yum update -y
yum install -y curl wget tar sqlite3
elif cat /etc/issue | grep -q -E -i "debian"; then
apt-get update -y
apt-get install -y curl wget tar sqlite3
elif cat /etc/issue | grep -q -E -i "ubuntu"; then
apt-get update -y
apt-get install -y curl wget tar sqlite3
else
echo -e "${Red}不支持的系统,建议使用 Debian 10+ / Ubuntu 20+ / CentOS 7+${Font}"
exit 1
fi
# 架构判断
echo -e "${Yellow}>> 正在识别 CPU 架构...${Font}"
ARCH=$(uname -m)
FILE_NAME=""
case $ARCH in
x86_64)
echo -e "架构识别: ${Green}AMD64${Font}"
FILE_NAME="x-ui-linux-amd64.tar.gz"
;;
aarch64)
echo -e "架构识别: ${Green}ARM64${Font}"
FILE_NAME="x-ui-linux-arm64.tar.gz"
;;
i386|i686)
echo -e "架构识别: ${Green}386${Font}"
FILE_NAME="x-ui-linux-386.tar.gz"
;;
armv5*)
echo -e "架构识别: ${Green}ARMv5${Font}"
FILE_NAME="x-ui-linux-armv5.tar.gz"
;;
*)
echo -e "${Red}不支持的架构: $ARCH${Font}"
exit 1
;;
esac
DOWNLOAD_URL="${BASE_URL}/${FILE_NAME}"
# ==========================================
# 3. 安装包智能处理 (本地检测 + 完整性校验)
# ==========================================
cd /usr/local/
NEED_DOWNLOAD=1
# 检查本地是否已有文件
if [[ -f "$FILE_NAME" ]]; then
echo -e "${Yellow}发现本地存在安装包,正在检查完整性...${Font}"
# 使用 tar -tzf 测试压缩包是否完好
if tar -tzf "$FILE_NAME" >/dev/null 2>&1; then
echo -e "${Green}本地安装包完好,跳过下载步骤!${Font}"
NEED_DOWNLOAD=0
else
echo -e "${Red}本地安装包已损坏,删除并重新下载...${Font}"
rm -f "$FILE_NAME"
fi
fi
# 下载流程
if [[ $NEED_DOWNLOAD -eq 1 ]]; then
echo -e "${Yellow}开始下载: ${DOWNLOAD_URL}${Font}"
wget -N --no-check-certificate -O "$FILE_NAME" "$DOWNLOAD_URL"
# 备用下载方式
if [[ $? -ne 0 ]]; then
echo -e "${Red}Wget 失败,尝试 Curl...${Font}"
curl -L -k -o "$FILE_NAME" "$DOWNLOAD_URL"
fi
# 下载后再次校验
if ! tar -tzf "$FILE_NAME" >/dev/null 2>&1; then
echo -e "${Red}致命错误:下载的文件损坏或网络连接失败!${Font}"
exit 1
fi
fi
# 解压安装
echo -e "${Yellow}正在安装...${Font}"
rm -rf x-ui
tar zxvf "$FILE_NAME"
chmod +x x-ui/x-ui x-ui/bin/xray-linux-*
# ==========================================
# 4. 配置写入 (三重保险机制)
# ==========================================
echo -e "${Yellow}>> 正在修改配置 (端口:$SET_PORT 用户:$SET_USER 密码:$SET_PASS)...${Font}"
cd x-ui
# 停止旧服务防止锁库
systemctl stop x-ui 2>/dev/null
pkill -f x-ui 2>/dev/null
CONFIG_SUCCESS=0
# --- 方案 A: 标准命令 ---
./x-ui setting -port $SET_PORT -username $SET_USER -password $SET_PASS >/dev/null 2>&1
if [[ $? -eq 0 ]]; then
echo -e "${Green}[方案A] 标准命令修改成功。${Font}"
CONFIG_SUCCESS=1
else
echo -e "${Red}[方案A] 失败,尝试方案 B...${Font}"
# --- 方案 B: 初始化后重试 ---
# 先运行一次生成数据库文件,然后杀死,再改
./x-ui >/dev/null 2>&1 &
PID=$!
sleep 3
kill $PID 2>/dev/null
./x-ui setting -port $SET_PORT -username $SET_USER -password $SET_PASS >/dev/null 2>&1
if [[ $? -eq 0 ]]; then
echo -e "${Green}[方案B] 强制重写成功。${Font}"
CONFIG_SUCCESS=1
else
echo -e "${Red}[方案B] 失败,尝试方案 C (SQLite 直接注入)...${Font}"
# --- 方案 C: SQLite 直接操作数据库 ---
if command -v sqlite3 >/dev/null 2>&1; then
# 确保数据库目录存在
mkdir -p /etc/x-ui
# 如果数据库不存在可能无法操作这里假设前面运行过至少生成了DB
if [[ -f "$DB_PATH" ]]; then
sqlite3 "$DB_PATH" "UPDATE settings SET value='$SET_PORT' WHERE key='webPort';"
sqlite3 "$DB_PATH" "UPDATE users SET username='$SET_USER', password='$SET_PASS' WHERE id=1;"
# 注意上面这行假设只有一个用户且ID为1X-UI结构复杂仅尝试修改端口最为稳妥
echo -e "${Green}[方案C] 数据库直接修改尝试完成。${Font}"
CONFIG_SUCCESS=1
fi
fi
fi
fi
if [[ $CONFIG_SUCCESS -eq 0 ]]; then
echo -e "${Red}警告:所有自动配置尝试均失败,请安装后手动运行 ./x-ui setting 设置。${Font}"
fi
# ==========================================
# 5. 启动服务 (双重保险机制)
# ==========================================
echo -e "${Yellow}>> 正在配置启动项...${Font}"
# --- 启动方案 1: Systemd (推荐) ---
cat > /etc/systemd/system/x-ui.service <<EOF
[Unit]
Description=x-ui Service
After=network.target
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/x-ui/x-ui
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable x-ui
systemctl restart x-ui
sleep 2
STATUS=$(systemctl is-active x-ui)
if [[ "$STATUS" == "active" ]]; then
echo -e "${Green}[启动方案1] Systemd 服务启动成功!${Font}"
else
echo -e "${Red}[启动方案1] Systemd 启动失败,尝试暴力启动 (Nohup)...${Font}"
# --- 启动方案 2: Nohup 后台运行 + rc.local ---
nohup /usr/local/x-ui/x-ui >/usr/local/x-ui/x-ui.log 2>&1 &
# 写入 rc.local 实现开机自启
if [ ! -f /etc/rc.local ]; then
echo '#!/bin/bash' > /etc/rc.local
chmod +x /etc/rc.local
fi
if ! grep -q "x-ui" /etc/rc.local; then
sed -i '$i nohup /usr/local/x-ui/x-ui >/usr/local/x-ui/x-ui.log 2>&1 &' /etc/rc.local
echo -e "${Green}已将启动命令写入 /etc/rc.local${Font}"
fi
echo -e "${Green}[启动方案2] 已通过后台进程启动。${Font}"
fi
# ==========================================
# 6. 防火墙与收尾
# ==========================================
# 简单粗暴放行
iptables -I INPUT -p tcp --dport $SET_PORT -j ACCEPT 2>/dev/null
ufw allow $SET_PORT/tcp 2>/dev/null
firewall-cmd --zone=public --add-port=$SET_PORT/tcp --permanent 2>/dev/null
firewall-cmd --reload 2>/dev/null
IP=$(curl -s4m8 ip.sb)
echo -e ""
echo -e "${Blue}#################################################${Font}"
echo -e "${Green} 咸v咆哮制作 - 安装完成 ${Font}"
echo -e "${Blue}#################################################${Font}"
echo -e "访问地址 ${Green}http://$IP:$SET_PORT${Font}"
echo -e "用户名 ${Green}$SET_USER${Font}"
echo -e "密码 ${Green}$SET_PASS${Font}"
echo -e "${Blue}#################################################${Font}"
echo -e "如果访问不通,请检查服务器安全组是否放行 $SET_PORT 端口"