From 2dce6b09d498f48445b5eb61224718c0f5bce39b Mon Sep 17 00:00:00 2001 From: xzx3344521 Date: Sat, 20 Dec 2025 22:19:29 +0800 Subject: [PATCH] Update xu --- xu | 594 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 506 insertions(+), 88 deletions(-) diff --git a/xu b/xu index 6bcc5ce..95d3248 100644 --- a/xu +++ b/xu @@ -1,109 +1,527 @@ #!/bin/bash +# 咸v咆哮制作 -# ========================================================= -# X-UI 多架构自动安装 - 容错增强版 -# ========================================================= +# x-ui 多架构自动安装脚本 +# 支持: amd64, 386, arm64, armv5, armv6, armv7, s390x +# 默认配置: 端口 8443, 账号 3344, 密码 3344 +# 咸v咆哮制作 - 一键搞定所有架构! -# 1. 基础环境自动修复(防止系统啥都没装) -prepare_environment() { - echo -e "\033[32m[1/5] 正在安装基础组件 (wget/curl/tar)...\033[0m" - if command -v apt-get >/dev/null 2>&1; then - apt-get update -y && apt-get install -y wget curl tar gzip ca-certificates || true - elif command -v yum >/dev/null 2>&1; then - yum install -y wget curl tar gzip ca-certificates || true - fi +set -e # 遇到错误立即退出 + +@@ -12,6 +13,7 @@ GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# 自定义配置 +@@ -42,23 +44,60 @@ warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +error() { echo -e "${RED}[ERROR]${NC} $1"; } +step() { echo -e "${BLUE}[STEP]${NC} $1"; } +debug() { echo -e "${PURPLE}[DEBUG]${NC} $1"; } +cyan() { echo -e "${CYAN}$1${NC}"; } + +# 显示大字标题 +show_banner() { + echo + echo -e "${CYAN}" + echo " ███████╗██╗ ██╗ ██╗ ██╗██╗" + echo " ╚══███╔╝╚██╗██╔╝ ██║ ██║██║" + echo " ███╔╝ ╚███╔╝ ██║ ██║██║" + echo " ███╔╝ ██╔██╗ ██║ ██║██║" + echo " ███████╗██╔╝ ██╗ ╚██████╔╝██║" + echo " ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝" + echo + echo -e "${RED}╔════════════════════════════════════════╗" + echo -e "║ ║" + echo -e "║ ${YELLOW}🚀 超强多架构 X-UI 一键安装脚本 ${RED} ║" + echo -e "║ ║" + echo -e "║ ${GREEN}📦 支持所有主流CPU架构 ${RED} ║" + echo -e "║ ${BLUE}⚡ 自动检测 + 自动配置 ${RED} ║" + echo -e "║ ${PURPLE}🎯 咸v咆哮制作 - 专治各种不服! ${RED} ║" + echo -e "║ ║" + echo -e "${RED}╚════════════════════════════════════════╝" + echo -e "${NC}" } -# 2. 架构智能检测 -detect_arch() { - echo -e "\033[32m[2/5] 检测系统架构...\033[0m" - local raw_arch=$(uname -m) - case "$raw_arch" in - x86_64) ARCH="amd64" ;; - aarch64|arm64) ARCH="arm64" ;; - i386|i486|i586|i686) ARCH="386" ;; - armv7l) ARCH="armv7" ;; - s390x) ARCH="s390x" ;; - *) echo "不支持的架构: $raw_arch"; exit 1 ;; - esac +# 显示咆哮信息 +show_roar() { + echo + echo -e "${RED}╔══════════════════════════════════════════════════╗" + echo -e "║ ║" + echo -e "║ ${YELLOW}🔥 咸v咆哮宣言:${RED} ║" + echo -e "║ ║" + echo -e "║ ${GREEN}「管你什么架构,老子一键搞定!」${RED} ║" + echo -e "║ ${CYAN}「AMD、Intel、ARM、IBM... 通通拿下!」${RED} ║" + echo -e "║ ${PURPLE}「拒绝复杂操作,只要简单粗暴!」${RED} ║" + echo -e "║ ║" + echo -e "${RED}╚══════════════════════════════════════════════════╝" + echo -e "${NC}" } -# 3. 冗余下载方案(如果源1失败,尝试源2) +# 检测系统架构 +detect_architecture() { +local arch=$(uname -m) + step "检测系统架构: $arch" + step "🔍 正在检测系统架构..." + cyan "👉 当前架构: $arch" + +# 映射到对应的下载架构 +if [[ -n "${ARCH_MAP[$arch]}" ]]; then +DETECTED_ARCH="${ARCH_MAP[$arch]}" + info "检测到架构: $arch → $DETECTED_ARCH" + info "🎯 架构识别: $arch → $DETECTED_ARCH" +else + error "不支持的架构: $arch" + error "❌ 不支持的架构: $arch" +echo + info "支持的架构:" + for key in "${!ARCH_MAP[@]}"; do + echo " $key -> ${ARCH_MAP[$key]}" + done + show_arch_info +exit 1 +fi +} +@@ -69,22 +108,23 @@ build_download_url() { +DOWNLOAD_URL="${BASE_URL}/${filename}" +DOWNLOAD_FILENAME="$filename" + + info "下载文件: $DOWNLOAD_FILENAME" + debug "下载URL: $DOWNLOAD_URL" + info "📥 下载文件: $DOWNLOAD_FILENAME" + debug "🔗 下载URL: $DOWNLOAD_URL" +} + +# 检查 root 权限 +check_root() { +if [ "$EUID" -ne 0 ]; then + error "请使用 root 权限运行此脚本" + info "尝试使用: sudo bash $0" + error "❌ 请使用 root 权限运行此脚本!" + info "💡 尝试使用: ${CYAN}sudo bash $0${NC}" +exit 1 +fi + info "✅ Root权限检查通过" +} + +# 安装依赖 +install_dependencies() { + info "检查并安装必要的依赖..." + info "📦 检查并安装必要的依赖..." + +if command -v apt-get >/dev/null 2>&1; then +# Debian/Ubuntu +@@ -100,44 +140,47 @@ install_dependencies() { +# Alpine +apk add wget tar curl sqlite +else + warn "无法确定包管理器,跳过依赖安装" + warn "⚠ 无法确定包管理器,跳过依赖安装" +fi + info "✅ 依赖安装完成" +} + +# 下载 x-ui download_xui() { - echo -e "\033[32m[3/5] 正在下载程序包...\033[0m" - local filename="x-ui-linux-${ARCH}.tar.gz" - local base_url="https://g1.vps7k7k.xyz/xui" - local success=false + info "开始下载 x-ui..." + info "📥 开始下载 x-ui..." - # [cite_start]方案 A: 标准下载 [cite: 36, 38] - if wget --no-check-certificate -O "$filename" "${base_url}/${filename}" || \ - curl -L -k -o "$filename" "${base_url}/${filename}"; then - success=true - fi +# 检查是否已存在文件 +if [ -f "$DOWNLOAD_FILENAME" ]; then + warn "发现已存在的文件 $DOWNLOAD_FILENAME" + read -p "是否重新下载? (y/N): " -n 1 -r + warn "📁 发现已存在的文件: $DOWNLOAD_FILENAME" + read -p "🔄 是否重新下载? (y/N): " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then +rm -f "$DOWNLOAD_FILENAME" +else + info "使用已存在的文件" + info "✅ 使用已存在的文件" +return 0 +fi +fi - # [cite_start]方案 B: ARM64 特殊备份名下载 [cite: 12, 44] - if [ "$success" = false ] && [ "$ARCH" = "arm64" ]; then - echo "尝试 ARM64 备用链接..." - wget --no-check-certificate -O "$filename" "${base_url}/x-ui-linux-arm64%20(1).tar.gz" && success=true - fi - - if [ "$success" = false ]; then - echo "错误:所有下载源均失效!" - exit 1 - fi +# 下载文件 + info "正在下载,请稍候..." + info "⏬ 正在下载,请稍候..." + cyan "💾 文件: $DOWNLOAD_FILENAME" + +if wget --progress=bar:force "$DOWNLOAD_URL" -O "$DOWNLOAD_FILENAME"; then + info "下载完成" + info "✅ 下载完成!" +else + error "下载失败,请检查网络连接和URL" + error "URL: $DOWNLOAD_URL" + error "❌ 下载失败!" + error "🔗 请检查URL: $DOWNLOAD_URL" +exit 1 +fi } -# 4. 双引擎解压(防止 tar 版本过旧) -extract_xui() { - echo -e "\033[32m[4/5] 正在部署文件...\033[0m" - local file="x-ui-linux-${ARCH}.tar.gz" - - mkdir -p /usr/local/x-ui - # [cite_start]方式 1: 直接解压 [cite: 52] - if ! tar -zxf "$file" -C /usr/local/; then - echo "标准解压失败,尝试备用引擎..." - # [cite_start]方式 2: 管道解压 [cite: 53] - gunzip -c "$file" | tar x -C /usr/local/ - fi +# 解压并手动安装 +extract_and_install() { + info "解压文件..." + info "📂 解压文件..." - # [cite_start]权限修复 [cite: 56, 61, 62] - chmod +x /usr/local/x-ui/x-ui /usr/local/x-ui/bin/xray-linux-* 2>/dev/null || true - [cite_start]ln -sf /usr/local/x-ui/x-ui /usr/bin/x-ui [cite: 68] +if [ ! -f "$DOWNLOAD_FILENAME" ]; then + error "文件 $DOWNLOAD_FILENAME 不存在" + error "❌ 文件 $DOWNLOAD_FILENAME 不存在" +exit 1 +fi + +@@ -146,8 +189,9 @@ extract_and_install() { +mkdir -p x-ui-temp + +# 解压文件 + cyan "🔓 正在解压 $DOWNLOAD_FILENAME..." +if ! tar zxvf "$DOWNLOAD_FILENAME" -C x-ui-temp; then + error "解压失败,文件可能已损坏" + error "❌ 解压失败,文件可能已损坏" +exit 1 +fi + +@@ -159,11 +203,11 @@ extract_and_install() { +cd x-ui +fi + + info "开始手动安装 x-ui..." + info "🔧 开始手动安装 x-ui..." + +# 检查必要的文件 +if [ ! -f "x-ui" ]; then + error "未找到 x-ui 可执行文件" + error "❌ 未找到 x-ui 可执行文件" +ls -la +exit 1 +fi +@@ -175,7 +219,7 @@ extract_and_install() { +fi + +# 手动安装 + info "执行手动安装..." + info "⚡ 执行手动安装..." + +# 停止可能存在的旧服务 +systemctl stop x-ui 2>/dev/null || true +@@ -211,11 +255,12 @@ extract_and_install() { + +# 返回原目录 +cd - > /dev/null + info "✅ 文件安装完成" } -# [cite_start]5. 服务启动与初始化 [cite: 64, 70, 71] -finalize_install() { - echo -e "\033[32m[5/5] 正在初始化面板...\033[0m" - - # [cite_start]强制写入服务文件,不依赖解压出的文件 [cite: 64] - cat > /etc/systemd/system/x-ui.service </dev/null 2>&1 || true - echo -e "6\ny\n3344\n3344\ny" | x-ui >/dev/null 2>&1 || true - - echo -e "\033[36m安装完成!面板端口: 8443,账号密码均为 3344\033[0m" +systemctl daemon-reload +systemctl enable x-ui + info "✅ 系统服务配置完成" } -# 执行 -prepare_environment -detect_arch -download_xui -extract_xui -finalize_install +# 自定义配置面板 +customize_panel() { + step "开始自定义配置面板..." + step "🎛️ 开始自定义配置面板..." + +# 停止服务以进行配置 + info "停止 x-ui 服务进行配置..." + info "🛑 停止 x-ui 服务进行配置..." +systemctl stop x-ui 2>/dev/null || true + +# 等待服务停止 +@@ -259,82 +305,77 @@ customize_panel() { + +# 初始化数据库(如果不存在) +if [ ! -f "/etc/x-ui/x-ui.db" ]; then + info "初始化数据库..." + info "🗃️ 初始化数据库..." + +# 启动服务以创建初始数据库 +if systemctl start x-ui; then +sleep 5 +systemctl stop x-ui +sleep 3 +else + warn "服务启动失败,尝试直接创建数据库结构" + # 这里可以添加直接创建数据库的逻辑 + fi + + if [ ! -f "/etc/x-ui/x-ui.db" ]; then + warn "无法自动创建数据库文件,将在首次启动时创建" + return 0 + warn "⚠ 服务启动失败,尝试直接创建数据库结构" +fi +fi + +# 修改配置(如果数据库存在且可写) +if [ -f "/etc/x-ui/x-ui.db" ] && command -v sqlite3 >/dev/null 2>&1; then + info "设置面板端口为: $PANEL_PORT" + cyan "🔧 设置面板端口: $PANEL_PORT" +sqlite3 /etc/x-ui/x-ui.db "UPDATE setting SET value = '$PANEL_PORT' WHERE key = 'port';" 2>/dev/null || true + + info "设置面板账号: $PANEL_USERNAME, 密码: $PANEL_PASSWORD" + cyan "👤 设置面板账号: $PANEL_USERNAME" + cyan "🔑 设置面板密码: $PANEL_PASSWORD" +sqlite3 /etc/x-ui/x-ui.db "UPDATE users SET username = '$PANEL_USERNAME', password = '$PANEL_PASSWORD' WHERE id = 1;" 2>/dev/null || true + +sqlite3 /etc/x-ui/x-ui.db "UPDATE setting SET value = 'false' WHERE key = 'hasDefaultCredential';" 2>/dev/null || true + info "自定义配置完成" + info "✅ 自定义配置完成" +else + warn "无法自动配置数据库,请在安装后手动修改配置" + warn "⚠ 无法自动配置数据库,请在安装后手动修改配置" +fi +} + +# 配置防火墙 +setup_firewall() { + info "配置防火墙..." + info "🔥 配置防火墙..." + +# 检查防火墙状态 +if command -v ufw >/dev/null 2>&1 && ufw status | grep -q "active"; then +# ufw +ufw allow ${PANEL_PORT}/tcp comment "x-ui Panel" +ufw allow 10000-20000/tcp comment "x-ui Proxy Ports" + info "UFW 防火墙已配置" + info "✅ UFW 防火墙已配置" +elif command -v firewall-cmd >/dev/null 2>&1 && firewall-cmd --state >/dev/null 2>&1; then +# firewalld +firewall-cmd --permanent --add-port=${PANEL_PORT}/tcp +firewall-cmd --permanent --add-port=10000-20000/tcp +firewall-cmd --reload + info "Firewalld 防火墙已配置" + info "✅ Firewalld 防火墙已配置" +elif command -v iptables >/dev/null 2>&1; then +# iptables +iptables -I INPUT -p tcp --dport ${PANEL_PORT} -j ACCEPT +iptables -I INPUT -p tcp --dport 10000:20000 -j ACCEPT + info "iptables 规则已添加" + info "✅ iptables 规则已添加" + +# 尝试保存 iptables 规则 +if command -v iptables-save >/dev/null 2>&1; then +iptables-save > /etc/iptables.rules 2>/dev/null || true +fi +else + warn "未检测到防火墙,跳过配置" + warn "⚠ 未检测到防火墙,跳过配置" +fi +} + +# 启动服务 +start_service() { + info "启动 x-ui 服务..." + info "🚀 启动 x-ui 服务..." + +systemctl daemon-reload +systemctl enable x-ui + +# 启动服务 +if systemctl start x-ui; then + info "x-ui 服务启动命令执行成功" + info "✅ x-ui 服务启动命令执行成功" +else + error "x-ui 服务启动失败" + error "❌ x-ui 服务启动失败" +return 1 +fi + +@@ -343,25 +384,25 @@ start_service() { + +# 检查服务状态 +if systemctl is-active --quiet x-ui; then + info "✓ x-ui 服务运行正常" + info "✅ x-ui 服务运行正常" + +# 显示服务状态 +echo +systemctl status x-ui --no-pager -l +else +warn "⚠ x-ui 服务未运行,检查日志中..." +systemctl status x-ui --no-pager -l + warn "尝试手动启动: systemctl start x-ui" + warn "💡 尝试手动启动: systemctl start x-ui" +fi +} + +# 验证安装 +verify_installation() { + step "验证安装..." + step "🔍 验证安装..." + +# 检查服务状态 +if systemctl is-active --quiet x-ui; then + info "✓ 服务运行正常" + info "✅ 服务运行正常" +else +warn "⚠ 服务未运行,但安装已完成" +return 0 +@@ -370,19 +411,19 @@ verify_installation() { +# 检查端口监听 +if command -v netstat >/dev/null 2>&1; then +if netstat -tunlp 2>/dev/null | grep -q ":${PANEL_PORT} "; then + info "✓ 端口 ${PANEL_PORT} 监听正常" + info "✅ 端口 ${PANEL_PORT} 监听正常" +else +warn "⚠ 端口 ${PANEL_PORT} 未监听" +fi +elif command -v ss >/dev/null 2>&1; then +if ss -tunlp 2>/dev/null | grep -q ":${PANEL_PORT} "; then + info "✓ 端口 ${PANEL_PORT} 监听正常" + info "✅ 端口 ${PANEL_PORT} 监听正常" +else +warn "⚠ 端口 ${PANEL_PORT} 未监听" +fi +fi + + info "验证完成" + info "✅ 验证完成" +} + +# 显示安装信息 +@@ -391,54 +432,67 @@ show_info() { +local server_ip=$(curl -s --connect-timeout 5 ipv4.icanhazip.com || hostname -I | awk '{print $1}' || echo "你的服务器IP") + +echo + info "==================================================" + info "🎉 x-ui 多架构安装完成!" + info "==================================================" + info "系统架构: $(uname -m) → $DETECTED_ARCH" + info "管理面板: http://${server_ip}:${PANEL_PORT}" + info "用户名: $PANEL_USERNAME" + info "密码: $PANEL_PASSWORD" + info "" + info "面板状态: 已自动配置为指定端口和账号" + info "" + echo -e "${GREEN}╔══════════════════════════════════════════════════╗" + echo -e "║ ║" + echo -e "║ 🎉 X-UI 多架构安装完成!咸v咆哮牛逼! ║" + echo -e "║ ║" + echo -e "╚══════════════════════════════════════════════════╝${NC}" + echo + info "🖥️ 系统架构: $(uname -m) → $DETECTED_ARCH" + info "🌐 管理面板: http://${server_ip}:${PANEL_PORT}" + info "👤 用户名: $PANEL_USERNAME" + info "🔑 密码: $PANEL_PASSWORD" + echo + cyan "💡 面板状态: 已自动配置为指定端口和账号" + echo +warn "⚠️ 重要安全提醒:" +warn "1. 请立即访问面板验证登录" + warn "2. 建议定期修改密码" + warn "2. 建议定期修改密码" +warn "3. 确保防火墙已正确配置" + info "" + info "常用命令:" + info "启动服务: systemctl start x-ui" + info "停止服务: systemctl stop x-ui" + info "重启服务: systemctl restart x-ui" + info "查看状态: systemctl status x-ui" + info "查看日志: journalctl -u x-ui -f" + info "管理菜单: x-ui" + info "==================================================" + echo + info "🔧 常用命令:" + info " 启动服务: systemctl start x-ui" + info " 停止服务: systemctl stop x-ui" + info " 重启服务: systemctl restart x-ui" + info " 查看状态: systemctl status x-ui" + info " 查看日志: journalctl -u x-ui -f" + info " 管理菜单: x-ui" +echo + +# 显示访问URL + step "立即访问: http://${server_ip}:${PANEL_PORT}" + step "使用账号: $PANEL_USERNAME 密码: $PANEL_PASSWORD" + echo + echo -e "${CYAN}" + echo "╔══════════════════════════════════════════════════╗" + echo "║ 🚀 立即访问 🚀 ║" + echo "║ ║" + echo "║ http://${server_ip}:${PANEL_PORT} ║" + echo "║ ║" + echo "║ 👤 账号: $PANEL_USERNAME ║" + echo "║ 🔑 密码: $PANEL_PASSWORD ║" + echo "║ ║" + echo "╚══════════════════════════════════════════════════╝" + echo -e "${NC}" +} + +# 显示架构信息 +show_arch_info() { +echo +info "🖥️ 支持的架构列表:" + echo " x86_64 - 64位 Intel/AMD 处理器 → amd64" + echo " i386 - 32位 Intel/AMD 处理器 → 386" + echo " aarch64 - 64位 ARM 处理器 → arm64" + echo " armv7l - 32位 ARM v7 → armv7" + echo " armv6l - 32位 ARM v6 → armv6" + echo " armv5l - 32位 ARM v5 → armv5" + echo " s390x - IBM 大型机 → s390x" + echo -e " ${CYAN}x86_64${NC} - 64位 Intel/AMD 处理器 ${GREEN}→ amd64${NC}" + echo -e " ${CYAN}i386${NC} - 32位 Intel/AMD 处理器 ${GREEN}→ 386${NC}" + echo -e " ${CYAN}aarch64${NC} - 64位 ARM 处理器 ${GREEN}→ arm64${NC}" + echo -e " ${CYAN}armv7l${NC} - 32位 ARM v7 ${GREEN}→ armv7${NC}" + echo -e " ${CYAN}armv6l${NC} - 32位 ARM v6 ${GREEN}→ armv6${NC}" + echo -e " ${CYAN}armv5l${NC} - 32位 ARM v5 ${GREEN}→ armv5${NC}" + echo -e " ${CYAN}s390x${NC} - IBM 大型机 ${GREEN}→ s390x${NC}" +echo +} + +# 主函数 +main() { + info "开始 x-ui 多架构自动安装..." + show_banner + show_roar + + info "🚀 开始 x-ui 多架构自动安装..." +show_arch_info + +# 执行安装步骤 +@@ -455,19 +509,26 @@ main() { +verify_installation +show_info + + info "安装脚本执行完毕" + echo + echo -e "${RED}╔════════════════════════════════════════╗" + echo -e "║ ║" + echo -e "║ ${YELLOW}🎊 安装完成!咸v咆哮感谢使用!${RED} ║" + echo -e "║ ${GREEN}💪 有問題就咆哮,老子帮你搞定!${RED} ║" + echo -e "║ ║" + echo -e "${RED}╚════════════════════════════════════════╝${NC}" + echo +} + +# 显示欢迎信息 +show_banner +echo +warn "🚀 x-ui 多架构自动安装脚本" +info "默认配置: 端口 ${PANEL_PORT} | 账号 ${PANEL_USERNAME}/${PANEL_PASSWORD}" +cyan "🔧 默认配置: 端口 ${PANEL_PORT} | 账号 ${PANEL_USERNAME} | 密码 ${PANEL_PASSWORD}" +echo + +read -p "是否继续安装? (y/N): " -n 1 -r +read -p "🔥 是否开始安装? (y/N): " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + info "安装已取消" + info "👋 安装已取消" +exit 0 +fi