#!/bin/bash # x-ui 多架构自动安装脚本 # 支持: amd64, 386, arm64, armv5, armv6, armv7, s390x # 默认配置: 端口 8443, 账号 3344, 密码 3344 # 咸鱼咆哮制作 - 一键搞定所有架构! set -e # 遇到错误立即退出 # 颜色定义 RED='\033[0;31m' 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 # 自定义配置 PANEL_PORT="8443" PANEL_USERNAME="3344" PANEL_PASSWORD="3344" # 架构映射表 - 包含特殊文件名 declare -A ARCH_MAP=( ["x86_64"]="amd64" ["i386"]="386" ["i486"]="386" ["i586"]="386" ["i686"]="386" ["aarch64"]="arm64" ["armv5l"]="armv5" ["armv6l"]="armv6" ["armv7l"]="armv7" ["s390x"]="s390x" ) # 特殊文件名映射(用于arm64的特殊情况) declare -A FILENAME_MAP=( ["amd64"]="x-ui-linux-amd64.tar.gz" ["386"]="x-ui-linux-386.tar.gz" ["arm64"]="x-ui-linux-arm64.tar.gz" # 优先使用这个 ["arm64-alt"]="x-ui-linux-arm64%20(1).tar.gz" # 备用文件名 ["armv5"]="x-ui-linux-armv5.tar.gz" ["armv6"]="x-ui-linux-armv6.tar.gz" ["armv7"]="x-ui-linux-armv7.tar.gz" ["s390x"]="x-ui-linux-s390x.tar.gz" ) # 下载URL基础 BASE_URL="https://g1.vps7k7k.xyz/xui" # 打印彩色信息 info() { echo -e "${GREEN}[INFO]${NC} $1"; } 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}🎯 咸鱼咆哮制作 ${RED} ║" echo -e "║ ║" echo -e "${RED}╚════════════════════════════════════════╝" echo -e "${NC}" } # 检测系统架构 detect_architecture() { local arch=$(uname -m) step "🔍 正在检测系统架构..." cyan "👉 当前架构: $arch" # 映射到对应的下载架构 if [[ -n "${ARCH_MAP[$arch]}" ]]; then DETECTED_ARCH="${ARCH_MAP[$arch]}" info "🎯 架构识别: $arch → $DETECTED_ARCH" else error "❌ 不支持的架构: $arch" echo show_arch_info exit 1 fi } # 构建下载URL(智能选择最佳文件) build_download_url() { step "🔗 构建下载链接..." # 获取基础文件名 local base_filename="${FILENAME_MAP[$DETECTED_ARCH]}" if [ -z "$base_filename" ]; then error "❌ 未找到对应架构的文件名" exit 1 fi # 特殊处理arm64:尝试两个文件名 if [ "$DETECTED_ARCH" = "arm64" ]; then info "🔄 ARM64架构检测到多个版本,智能选择..." # 主要文件 DOWNLOAD_FILENAME="x-ui-linux-arm64.tar.gz" DOWNLOAD_URL="${BASE_URL}/${DOWNLOAD_FILENAME}" # 备用文件 ALT_FILENAME="x-ui-linux-arm64%20(1).tar.gz" ALT_URL="${BASE_URL}/${ALT_FILENAME}" cyan "📄 主文件: $DOWNLOAD_FILENAME" cyan "📄 备选: $ALT_FILENAME" else DOWNLOAD_FILENAME="$base_filename" DOWNLOAD_URL="${BASE_URL}/${DOWNLOAD_FILENAME}" info "📥 下载文件: $DOWNLOAD_FILENAME" fi debug "🔗 下载URL: $DOWNLOAD_URL" } # 检查磁盘空间 check_disk_space() { step "💾 检查磁盘空间..." # 检查根分区可用空间 local available_kb=$(df / | awk 'NR==2 {print $4}' 2>/dev/null || echo "0") local available_mb=$((available_kb / 1024)) cyan "📊 当前可用磁盘空间: ${available_mb}MB" if [ $available_mb -lt 50 ]; then warn "⚠ 磁盘空间紧张,尝试清理..." # 尝试清理临时文件 rm -rf /tmp/* 2>/dev/null || true rm -rf /var/tmp/* 2>/dev/null || true # 重新检查 available_kb=$(df / | awk 'NR==2 {print $4}' 2>/dev/null || echo "0") available_mb=$((available_kb / 1024)) cyan "📊 清理后可用空间: ${available_mb}MB" if [ $available_mb -lt 50 ]; then error "❌ 磁盘空间不足!至少需要 50MB 可用空间" read -p "⚠️ 是否继续尝试? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then info "👋 安装已取消" exit 1 fi fi else info "✅ 磁盘空间充足" fi } # 检查 root 权限 check_root() { if [ "$EUID" -ne 0 ]; then error "❌ 请使用 root 权限运行此脚本!" info "💡 尝试使用: ${CYAN}sudo bash $0${NC}" exit 1 fi info "✅ Root权限检查通过" } # 安装依赖(优化版) install_dependencies() { info "📦 检查必要工具..." # 检查必要命令是否已存在 local tools_ok=true if ! command -v wget >/dev/null 2>&1 && ! command -v curl >/dev/null 2>&1; then warn "⚠ 没有可用的下载工具 (wget/curl)" tools_ok=false fi if ! command -v tar >/dev/null 2>&1; then warn "⚠ 缺少 tar 命令" tools_ok=false fi if ! command -v systemctl >/dev/null 2>&1; then warn "⚠ 缺少 systemctl 命令" fi if $tools_ok; then info "✅ 必要工具已就绪" return 0 fi # 尝试安装缺少的工具 warn "🛠️ 尝试安装缺少的工具..." if command -v apt-get >/dev/null 2>&1; then # Debian/Ubuntu apt-get update 2>/dev/null || true apt-get install -y wget tar 2>/dev/null || true elif command -v yum >/dev/null 2>&1; then # CentOS/RHEL yum install -y wget tar 2>/dev/null || true elif command -v dnf >/dev/null 2>&1; then # Fedora dnf install -y wget tar 2>/dev/null || true fi info "✅ 依赖检查完成" } # 下载 x-ui(智能版本选择) download_xui() { info "📥 开始下载 x-ui..." # 检查是否已存在文件 if [ -f "$DOWNLOAD_FILENAME" ]; then warn "📁 发现已存在的文件: $DOWNLOAD_FILENAME" read -p "🔄 是否重新下载? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then rm -f "$DOWNLOAD_FILENAME" else info "✅ 使用已存在的文件" return 0 fi fi # 特殊处理ARM64:尝试多个文件 if [ "$DETECTED_ARCH" = "arm64" ]; then download_arm64_smart else download_normal fi } # 下载普通架构 download_normal() { cyan "💾 下载文件: $DOWNLOAD_FILENAME" # 尝试curl下载 if command -v curl >/dev/null 2>&1; then info "⚡ 使用 curl 下载..." if curl -L -o "$DOWNLOAD_FILENAME" "$DOWNLOAD_URL"; then info "✅ 下载完成!" return 0 fi fi # 尝试wget下载 if command -v wget >/dev/null 2>&1; then info "⚡ 使用 wget 下载..." if wget --progress=bar:force "$DOWNLOAD_URL" -O "$DOWNLOAD_FILENAME"; then info "✅ 下载完成!" return 0 fi fi error "❌ 下载失败!" exit 1 } # 智能下载ARM64版本 download_arm64_smart() { info "🤖 ARM64智能下载模式..." local downloaded=false # 尝试主文件 cyan "🔄 尝试主文件: $DOWNLOAD_FILENAME" if command -v curl >/dev/null 2>&1; then if curl -L -o "$DOWNLOAD_FILENAME" "$DOWNLOAD_URL"; then info "✅ 主文件下载成功!" downloaded=true fi elif command -v wget >/dev/null 2>&1; then if wget --progress=bar:force "$DOWNLOAD_URL" -O "$DOWNLOAD_FILENAME"; then info "✅ 主文件下载成功!" downloaded=true fi fi # 如果主文件失败,尝试备用文件 if [ "$downloaded" = false ]; then warn "⚠ 主文件下载失败,尝试备选文件..." DOWNLOAD_FILENAME="x-ui-linux-arm64 (1).tar.gz" DOWNLOAD_URL="${BASE_URL}/x-ui-linux-arm64%20(1).tar.gz" cyan "🔄 尝试备选文件: $DOWNLOAD_FILENAME" if command -v curl >/dev/null 2>&1; then if curl -L -o "$DOWNLOAD_FILENAME" "$DOWNLOAD_URL"; then info "✅ 备选文件下载成功!" downloaded=true fi elif command -v wget >/dev/null 2>&1; then if wget --progress=bar:force "$DOWNLOAD_URL" -O "$DOWNLOAD_FILENAME"; then info "✅ 备选文件下载成功!" downloaded=true fi fi fi if [ "$downloaded" = false ]; then error "❌ ARM64版本下载失败,两个文件都不可用" exit 1 fi } # 解压并手动安装 extract_and_install() { info "📂 解压文件..." if [ ! -f "$DOWNLOAD_FILENAME" ]; then error "❌ 文件 $DOWNLOAD_FILENAME 不存在" exit 1 fi # 检查文件大小 local file_size=$(stat -c%s "$DOWNLOAD_FILENAME" 2>/dev/null || wc -c < "$DOWNLOAD_FILENAME") local file_size_mb=$((file_size / 1024 / 1024)) cyan "📦 文件大小: ${file_size_mb}MB" if [ $file_size_mb -lt 10 ]; then warn "⚠ 文件大小异常,可能下载失败" fi # 清理旧文件 rm -rf x-ui-temp mkdir -p x-ui-temp # 解压文件 cyan "🔓 正在解压 $DOWNLOAD_FILENAME..." if tar zxvf "$DOWNLOAD_FILENAME" -C x-ui-temp; then info "✅ 解压成功" else error "❌ 解压失败,文件可能已损坏" # 尝试其他解压方式 warn "🔄 尝试其他解压方式..." if gzip -dc "$DOWNLOAD_FILENAME" | tar xv -C x-ui-temp 2>/dev/null; then info "✅ 备用解压方式成功" else exit 1 fi fi # 进入解压目录 cd x-ui-temp # 查找 x-ui 目录 if [ -d "x-ui" ]; then cd x-ui info "📁 进入 x-ui 目录" else info "📁 当前目录包含:" ls -la fi info "🔧 开始安装 x-ui..." # 检查必要的文件 if [ ! -f "x-ui" ]; then error "❌ 未找到 x-ui 可执行文件" exit 1 fi # 设置执行权限 chmod +x x-ui if [ -f "x-ui.sh" ]; then chmod +x x-ui.sh fi # 停止可能存在的旧服务 systemctl stop x-ui 2>/dev/null || true # 复制文件到系统目录 mkdir -p /usr/local/x-ui/ cp -f x-ui /usr/local/x-ui/ if [ -f "x-ui.sh" ]; then cp -f x-ui.sh /usr/local/x-ui/ fi if [ -f "x-ui.service" ]; then cp -f x-ui.service /etc/systemd/system/ fi # 复制 bin 目录 if [ -d "bin" ]; then cp -rf bin /usr/local/x-ui/ fi # 设置权限 chmod +x /usr/local/x-ui/x-ui if [ -f "/usr/local/x-ui/x-ui.sh" ]; then chmod +x /usr/local/x-ui/x-ui.sh fi chmod +x /usr/local/x-ui/bin/xray-linux-* 2>/dev/null || true # 创建符号链接 if [ -f "/usr/local/x-ui/x-ui.sh" ]; then ln -sf /usr/local/x-ui/x-ui.sh /usr/bin/x-ui else ln -sf /usr/local/x-ui/x-ui /usr/bin/x-ui fi # 返回原目录 cd - > /dev/null info "✅ 文件安装完成" } # 配置系统服务 setup_service() { info "🔌 配置系统服务..." # 如果服务文件不存在,创建它 if [ ! -f "/etc/systemd/system/x-ui.service" ]; then cat > /etc/systemd/system/x-ui.service << 'EOF' [Unit] Description=x-ui Service Documentation=https://github.com/MHSanaei/3x-ui After=network.target [Service] Type=simple User=root WorkingDirectory=/usr/local/x-ui/ ExecStart=/usr/local/x-ui/x-ui Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target EOF info "📄 创建了 systemd 服务文件" fi systemctl daemon-reload systemctl enable x-ui info "✅ 系统服务配置完成" } # 配置面板参数 configure_panel() { step "🎛️ 配置面板参数..." # 停止服务以进行配置 info "🛑 停止 x-ui 服务进行配置..." systemctl stop x-ui 2>/dev/null || true sleep 3 # 启动服务创建初始数据库 info "🗃️ 初始化数据库..." if systemctl start x-ui; then sleep 5 systemctl stop x-ui sleep 3 fi # 使用交互方式修改配置 modify_with_xui_command } # 使用x-ui命令修改配置 modify_with_xui_command() { # 确保x-ui命令可用 if [ ! -f "/usr/bin/x-ui" ]; then ln -sf /usr/local/x-ui/x-ui /usr/bin/x-ui 2>/dev/null || true fi # 启动服务 systemctl start x-ui sleep 5 if command -v x-ui >/dev/null 2>&1; then info "🔄 修改面板端口为: $PANEL_PORT" # 修改端口 echo -e "9\n$PANEL_PORT\ny\n" | timeout 10 x-ui >/dev/null 2>&1 || true sleep 2 info "🔄 修改账号密码为: $PANEL_USERNAME/$PANEL_PASSWORD" # 修改账号密码 echo -e "6\ny\n$PANEL_USERNAME\n$PANEL_PASSWORD\ny\ny\n" | timeout 10 x-ui >/dev/null 2>&1 || true sleep 2 info "✅ 配置修改完成" else warn "⚠ 无法自动配置,请手动配置:" info "💡 运行 'x-ui' 后选择:" info " 1. 选择 9 修改端口为 $PANEL_PORT" info " 2. 选择 6 修改账号为 $PANEL_USERNAME 密码为 $PANEL_PASSWORD" fi } # 配置防火墙 setup_firewall() { info "🔥 配置防火墙..." # 检查并配置端口 local port_open=false # 尝试ufw if command -v ufw >/dev/null 2>&1 && ufw status | grep -q "active"; then ufw allow ${PANEL_PORT}/tcp info "✅ UFW 已开放端口 $PANEL_PORT" port_open=true fi # 尝试firewalld if command -v firewall-cmd >/dev/null 2>&1 && firewall-cmd --state >/dev/null 2>&1; then firewall-cmd --permanent --add-port=${PANEL_PORT}/tcp firewall-cmd --reload info "✅ Firewalld 已开放端口 $PANEL_PORT" port_open=true fi # 尝试iptables if command -v iptables >/dev/null 2>&1; then iptables -I INPUT -p tcp --dport ${PANEL_PORT} -j ACCEPT info "✅ iptables 已开放端口 $PANEL_PORT" port_open=true fi if [ "$port_open" = false ]; then warn "⚠ 未配置防火墙,请手动开放端口 $PANEL_PORT" fi } # 启动服务 start_service() { info "🚀 启动 x-ui 服务..." systemctl daemon-reload systemctl enable x-ui if systemctl restart x-ui; then info "✅ x-ui 服务启动成功" else warn "⚠ 服务启动异常,尝试直接启动..." systemctl start x-ui fi sleep 5 # 检查服务状态 if systemctl is-active --quiet x-ui; then info "✅ x-ui 服务运行正常" else warn "⚠ x-ui 服务状态异常" systemctl status x-ui --no-pager -l fi } # 验证安装 verify_installation() { step "🔍 验证安装..." # 检查服务状态 if systemctl is-active --quiet x-ui; then info "✅ 服务运行正常" # 检查端口 if command -v ss >/dev/null 2>&1; then if ss -tunlp | grep -q ":${PANEL_PORT} "; then info "✅ 端口 $PANEL_PORT 监听正常" else warn "⚠ 端口 $PANEL_PORT 未监听" fi fi else warn "⚠ 服务未运行" fi info "✅ 验证完成" } # 显示安装信息 show_info() { # 获取服务器IP local server_ip=$( (curl -s --connect-timeout 3 ipv4.icanhazip.com || hostname -I | awk '{print $1}' || echo "你的服务器IP") 2>/dev/null ) echo echo -e "${GREEN}╔══════════════════════════════════════════════════╗" echo -e "║ ║" echo -e "║ 🎉 X-UI 多架构安装完成!咸鱼咆哮制作! ║" echo -e "║ ║" echo -e "╚══════════════════════════════════════════════════╝${NC}" echo info "🖥️ 系统架构: $(uname -m) → $DETECTED_ARCH" info "🌐 管理面板: http://${server_ip}:${PANEL_PORT}" info "👤 用户名: $PANEL_USERNAME" info "🔑 密码: $PANEL_PASSWORD" echo info "🔧 管理命令: x-ui" info "📊 服务状态: systemctl status x-ui" echo # 显示访问URL 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 -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 } # 显示欢迎信息 show_welcome() { show_banner echo cyan "🔧 默认配置: 端口 ${PANEL_PORT} | 账号 ${PANEL_USERNAME} | 密码 ${PANEL_PASSWORD}" cyan "🌐 下载源: g1.vps7k7k.xyz" echo } # 主函数 main() { show_welcome info "🚀 开始 x-ui 多架构自动安装..." show_arch_info # 执行安装步骤 check_root check_disk_space detect_architecture build_download_url install_dependencies download_xui extract_and_install setup_service configure_panel setup_firewall start_service verify_installation show_info echo echo -e "${RED}╔════════════════════════════════════════╗" echo -e "║ ║" echo -e "║ ${YELLOW}🎊 安装完成!咸鱼咆哮感谢使用!${RED} ║" echo -e "║ ${GREEN}🐟 有问题请反馈,持续改进!${RED} ║" echo -e "║ ║" echo -e "${RED}╚════════════════════════════════════════╝${NC}" echo } # 询问是否开始 show_welcome read -p "🔥 是否开始安装? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then info "👋 安装已取消" exit 0 fi # 执行主函数 main