#!/bin/bash red='\033[0;31m' green='\033[0;32m' blue='\033[0;34m' yellow='\033[0;33m' plain='\033[0m' cur_dir=$(pwd) # 检查root权限 [[ $EUID -ne 0 ]] && echo -e "${red}致命错误: ${plain} 请使用root权限运行此脚本 \n " && exit 1 if ! ip addr show lo | grep -q '127.0.0.1'; then sudo ip addr add 127.0.0.1/8 dev lo fi # 检查操作系统并设置发行版变量 if [[ -f /etc/os-release ]]; then source /etc/os-release release=$ID elif [[ -f /usr/lib/os-release ]]; then source /usr/lib/os-release release=$ID else echo "检查系统操作系统失败,请联系作者!" >&2 exit 1 fi echo "操作系统发行版是: $release" arch() { case "$(uname -m)" in x86_64 | x64 | amd64) echo 'amd64' ;; i*86 | x86) echo '386' ;; armv8* | armv8 | arm64 | aarch64) echo 'arm64' ;; armv7* | armv7 | arm) echo 'armv7' ;; armv6* | armv6) echo 'armv6' ;; armv5* | armv5) echo 'armv5' ;; s390x) echo 's390x' ;; *) echo -e "${green}不支持的CPU架构! ${plain}" && rm -f install.sh && exit 1 ;; esac } echo "Arch: $(arch)" install_base() { case "${release}" in ubuntu | debian | armbian) apt-get update && apt-get install -y -q wget curl tar tzdata ;; centos | rhel | almalinux | rocky | ol) yum -y update && yum install -y -q wget curl tar tzdata ;; fedora | amzn | virtuozzo) dnf -y update && dnf install -y -q wget curl tar tzdata ;; arch | manjaro | parch) pacman -Syu && pacman -Syu --noconfirm wget curl tar tzdata ;; opensuse-tumbleweed) zypper refresh && zypper -q install -y wget curl tar timezone ;; *) apt-get update && apt-get install -y -q wget curl tar tzdata ;; esac } gen_random_string() { local length="$1" local random_string=$(LC_ALL=C tr -dc 'a-zA-Z0-9' /dev/null | tr -d '[:space:]') if [[ -n "${server_ip}" ]]; then break fi done if [[ ${#existing_webBasePath} -lt 4 ]]; then if [[ "$existing_hasDefaultCredential" == "true" ]]; then local config_webBasePath=$(gen_random_string 18) local config_username=$(gen_random_string 10) local config_password=$(gen_random_string 10) read -rp "您是否要自定义面板端口设置?(如果不设置,将应用随机端口)[y/n]: " config_confirm if [[ "${config_confirm}" == "y" || "${config_confirm}" == "Y" ]]; then read -rp "请设置面板端口: " config_port echo -e "${yellow}您的面板端口是: ${config_port}${plain}" else local config_port=$(shuf -i 1024-62000 -n 1) echo -e "${yellow}生成的随机端口: ${config_port}${plain}" fi /usr/local/x-ui/x-ui setting -username "${config_username}" -password "${config_password}" -port "${config_port}" -webBasePath "${config_webBasePath}" echo -e "这是全新安装,出于安全考虑生成随机登录信息:" echo -e "###############################################" echo -e "${green}用户名: ${config_username}${plain}" echo -e "${green}密码: ${config_password}${plain}" echo -e "${green}端口: ${config_port}${plain}" echo -e "${green}网页基础路径: ${config_webBasePath}${plain}" echo -e "${green}访问地址: http://${server_ip}:${config_port}/${config_webBasePath}${plain}" echo -e "###############################################" else local config_webBasePath=$(gen_random_string 18) echo -e "${yellow}网页基础路径缺失或过短。正在生成新的路径...${plain}" /usr/local/x-ui/x-ui setting -webBasePath "${config_webBasePath}" echo -e "${green}新的网页基础路径: ${config_webBasePath}${plain}" echo -e "${green}访问地址: http://${server_ip}:${existing_port}/${config_webBasePath}${plain}" fi else if [[ "$existing_hasDefaultCredential" == "true" ]]; then local config_username=$(gen_random_string 10) local config_password=$(gen_random_string 10) echo -e "${yellow}检测到默认凭据。需要安全更新...${plain}" /usr/local/x-ui/x-ui setting -username "${config_username}" -password "${config_password}" echo -e "生成新的随机登录凭据:" echo -e "###############################################" echo -e "${green}用户名: ${config_username}${plain}" echo -e "${green}密码: ${config_password}${plain}" echo -e "###############################################" else echo -e "${green}用户名、密码和网页基础路径已正确设置。退出中...${plain}" fi fi /usr/local/x-ui/x-ui migrate } install_x-ui() { cd /usr/local/ # 下载资源 if [ $# == 0 ]; then tag_version=$(curl -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') if [[ ! -n "$tag_version" ]]; then echo -e "${red}获取x-ui版本失败,可能是由于GitHub API限制,请稍后重试${plain}" exit 1 fi echo -e "获取到x-ui最新版本: ${tag_version},开始安装..." wget -N -O /usr/local/x-ui-linux-$(arch).tar.gz https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz if [[ $? -ne 0 ]]; then echo -e "${red}下载x-ui失败,请确保您的服务器可以访问GitHub ${plain}" exit 1 fi else tag_version=$1 tag_version_numeric=${tag_version#v} min_version="2.3.5" if [[ "$(printf '%s\n' "$min_version" "$tag_version_numeric" | sort -V | head -n1)" != "$min_version" ]]; then echo -e "${red}请使用更新的版本(至少v2.3.5)。退出安装。${plain}" exit 1 fi url="https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz" echo -e "开始安装x-ui $1" wget -N -O /usr/local/x-ui-linux-$(arch).tar.gz ${url} if [[ $? -ne 0 ]]; then echo -e "${red}下载x-ui $1失败,请检查版本是否存在 ${plain}" exit 1 fi fi wget -O /usr/bin/x-ui-temp https://raw.githubusercontent.com/sky22333/shell/main/3x-ui/x-ui.sh # 停止x-ui服务并删除旧资源 if [[ -e /usr/local/x-ui/ ]]; then systemctl stop x-ui rm /usr/local/x-ui/ -rf fi # 解压资源并设置权限 tar zxvf x-ui-linux-$(arch).tar.gz rm x-ui-linux-$(arch).tar.gz -f cd x-ui chmod +x x-ui chmod +x x-ui.sh # 检查系统架构并相应地重命名文件 if [[ $(arch) == "armv5" || $(arch) == "armv6" || $(arch) == "armv7" ]]; then mv bin/xray-linux-$(arch) bin/xray-linux-arm chmod +x bin/xray-linux-arm fi chmod +x x-ui bin/xray-linux-$(arch) # 更新x-ui命令行工具并设置权限 mv -f /usr/bin/x-ui-temp /usr/bin/x-ui chmod +x /usr/bin/x-ui config_after_install cp -f x-ui.service /etc/systemd/system/ systemctl daemon-reload systemctl enable x-ui systemctl start x-ui echo -e "${green}x-ui ${tag_version}${plain} 安装完成,现在正在运行..." echo -e "" echo -e "┌───────────────────────────────────────────────────────┐ │ ${blue}x-ui 控制菜单使用方法 (子命令):${plain} │ │ │ │ ${blue}x-ui${plain} - 管理脚本 │ │ ${blue}x-ui start${plain} - 启动 │ │ ${blue}x-ui stop${plain} - 停止 │ │ ${blue}x-ui restart${plain} - 重启 │ │ ${blue}x-ui status${plain} - 当前状态 │ │ ${blue}x-ui settings${plain} - 当前设置 │ │ ${blue}x-ui enable${plain} - 启用开机自启 │ │ ${blue}x-ui disable${plain} - 禁用开机自启 │ │ ${blue}x-ui log${plain} - 查看日志 │ │ ${blue}x-ui banlog${plain} - 查看Fail2ban封禁日志 │ │ ${blue}x-ui update${plain} - 更新 │ │ ${blue}x-ui legacy${plain} - 旧版本 │ │ ${blue}x-ui install${plain} - 安装 │ │ ${blue}x-ui uninstall${plain} - 卸载 │ └───────────────────────────────────────────────────────┘" } echo -e "${green}运行中...${plain}" install_base install_x-ui $1