From 1b4a5cebec96d4f7bc4ebd777dd2af293d7e4991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=83=E9=9A=A8=E7=B7=A3=E5=8B=95?= <88259403+xeefei@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:15:20 +0800 Subject: [PATCH] Update x-ui.sh --- x-ui.sh | 525 +++++++++++++++++++++++++++----------------------------- 1 file changed, 257 insertions(+), 268 deletions(-) diff --git a/x-ui.sh b/x-ui.sh index ddb4017b..14ea2703 100644 --- a/x-ui.sh +++ b/x-ui.sh @@ -19,7 +19,7 @@ function LOGI() { } # check root -[[ $EUID -ne 0 ]] && LOGE "ERROR: You must be root to run this script! \n" && exit 1 +[[ $EUID -ne 0 ]] && echo -e "${red}致命错误: ${plain} 请使用 root 权限运行此脚本\n" && exit 1 # Check OS and set release variable if [[ -f /etc/os-release ]]; then @@ -29,52 +29,55 @@ elif [[ -f /usr/lib/os-release ]]; then source /usr/lib/os-release release=$ID else - echo "Failed to check the system OS, please contact the author!" >&2 + echo "检查服务器操作系统失败,请联系作者!" >&2 exit 1 fi -echo "The OS release is: $release" +echo "目前服务器的操作系统为: $release" -os_version="" os_version=$(grep -i version_id /etc/os-release | cut -d \" -f2 | cut -d . -f1) -if [[ "${release}" == "arch" ]]; then - echo "Your OS is Arch Linux" -elif [[ "${release}" == "manjaro" ]]; then - echo "Your OS is Manjaro" -elif [[ "${release}" == "armbian" ]]; then - echo "Your OS is Armbian" -elif [[ "${release}" == "centos" ]]; then +if [[ "${release}" == "centos" ]]; then if [[ ${os_version} -lt 8 ]]; then - echo -e "${red} Please use CentOS 8 or higher ${plain}\n" && exit 1 + echo -e "${red} 请使用 CentOS 8 或更高版本 ${plain}\n" && exit 1 fi elif [[ "${release}" == "ubuntu" ]]; then if [[ ${os_version} -lt 20 ]]; then - echo -e "${red} Please use Ubuntu 20 or higher version!${plain}\n" && exit 1 + echo -e "${red} 请使用 Ubuntu 20 或更高版本!${plain}\n" && exit 1 fi + elif [[ "${release}" == "fedora" ]]; then if [[ ${os_version} -lt 36 ]]; then - echo -e "${red} Please use Fedora 36 or higher version!${plain}\n" && exit 1 + echo -e "${red} 请使用 Fedora 36 或更高版本!${plain}\n" && exit 1 fi + elif [[ "${release}" == "debian" ]]; then if [[ ${os_version} -lt 11 ]]; then - echo -e "${red} Please use Debian 11 or higher ${plain}\n" && exit 1 + echo -e "${red} 请使用 Debian 11 或更高版本 ${plain}\n" && exit 1 fi + elif [[ "${release}" == "almalinux" ]]; then if [[ ${os_version} -lt 9 ]]; then - echo -e "${red} Please use AlmaLinux 9 or higher ${plain}\n" && exit 1 + echo -e "${red} 请使用 AlmaLinux 9 或更高版本 ${plain}\n" && exit 1 fi + elif [[ "${release}" == "rocky" ]]; then if [[ ${os_version} -lt 9 ]]; then - echo -e "${red} Please use Rocky Linux 9 or higher ${plain}\n" && exit 1 + echo -e "${red} 请使用 RockyLinux 9 或更高版本 ${plain}\n" && exit 1 fi +elif [[ "${release}" == "arch" ]]; then + echo "您的操作系统是 ArchLinux" +elif [[ "${release}" == "manjaro" ]]; then + echo "您的操作系统是 Manjaro" +elif [[ "${release}" == "armbian" ]]; then + echo "您的操作系统是 Armbian" elif [[ "${release}" == "oracle" ]]; then if [[ ${os_version} -lt 8 ]]; then - echo -e "${red} Please use Oracle Linux 8 or higher ${plain}\n" && exit 1 + echo -e "${red} 请使用 Oracle Linux 8 或更高版本 ${plain}\n" && exit 1 fi else - echo -e "${red}Your operating system is not supported by this script.${plain}\n" - echo "Please ensure you are using one of the following supported operating systems:" + echo -e "${red}此脚本不支持您的操作系统。${plain}\n" + echo "请确保您使用的是以下受支持的操作系统之一:" echo "- Ubuntu 20.04+" echo "- Debian 11+" echo "- CentOS 8+" @@ -111,7 +114,7 @@ confirm() { } confirm_restart() { - confirm "Restart the panel, Attention: Restarting the panel will also restart xray" "y" + confirm "重启面板,注意:重启面板也会重启 xray" "y" if [[ $? == 0 ]]; then restart else @@ -120,12 +123,12 @@ confirm_restart() { } before_show_menu() { - echo && echo -n -e "${yellow}Press enter to return to the main menu: ${plain}" && read temp + echo && echo -n -e "${yellow}按 Enter 键返回主菜单:${plain}" && read temp show_menu } install() { - bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/main/install.sh) + bash <(curl -Ls https://raw.githubusercontent.com/Misaka-blog/3x-ui/main/install.sh) if [[ $? == 0 ]]; then if [[ $# == 0 ]]; then start @@ -136,36 +139,36 @@ install() { } update() { - confirm "This function will forcefully reinstall the latest version, and the data will not be lost. Do you want to continue?" "y" + confirm "该功能将强制安装最新版本,并且数据不会丢失。你想继续吗?" "y" if [[ $? != 0 ]]; then - LOGE "Cancelled" + LOGE "已取消" if [[ $# == 0 ]]; then before_show_menu fi return 0 fi - bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/main/install.sh) + bash <(curl -Ls https://raw.githubusercontent.com/Misaka-blog/3x-ui/main/install.sh) if [[ $? == 0 ]]; then - LOGI "Update is complete, Panel has automatically restarted " + LOGI "更新完成,面板已自动重启" exit 0 fi } custom_version() { - echo "Enter the panel version (like 2.0.0):" + echo "输入面板版本 (例: 2.0.0):" read panel_version if [ -z "$panel_version" ]; then - echo "Panel version cannot be empty. Exiting." + echo "面板版本不能为空。" exit 1 fi - download_link="https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh" + download_link="https://raw.githubusercontent.com/Misaka-blog/3x-ui/master/install.sh" # Use the entered panel version in the download link install_command="bash <(curl -Ls $download_link) v$panel_version" - echo "Downloading and installing panel version $panel_version..." + echo "下载并安装面板版本 $panel_version..." eval $install_command } @@ -176,7 +179,7 @@ delete_script() { } uninstall() { - confirm "Are you sure you want to uninstall the panel? xray will also uninstalled!" "n" + confirm "您确定要卸载面板吗? xray 也将被卸载!" "n" if [[ $? != 0 ]]; then if [[ $# == 0 ]]; then show_menu @@ -192,9 +195,9 @@ uninstall() { rm /usr/local/x-ui/ -rf echo "" - echo -e "Uninstalled Successfully.\n" - echo "If you need to install this panel again, you can use below command:" - echo -e "${green}bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)${plain}" + echo -e "卸载成功\n" + echo "如果您需要再次安装此面板,可以使用以下命令:" + echo -e "${green}bash <(curl -Ls https://raw.githubusercontent.com/Misaka-blog/3x-ui/master/install.sh)${plain}" echo "" # Trap the SIGTERM signal trap delete_script SIGTERM @@ -202,28 +205,28 @@ uninstall() { } reset_user() { - confirm "Are you sure to reset the username and password of the panel?" "n" + confirm "您确定重置面板的用户名和密码吗?" "n" if [[ $? != 0 ]]; then if [[ $# == 0 ]]; then show_menu fi return 0 fi - read -rp "Please set the login username [default is a random username]: " config_account + read -rp "请设置用户名 [默认为随机用户名]: " config_account [[ -z $config_account ]] && config_account=$(date +%s%N | md5sum | cut -c 1-8) - read -rp "Please set the login password [default is a random password]: " config_password + read -rp "请设置密码 [默认为随机密码]: " config_password [[ -z $config_password ]] && config_password=$(date +%s%N | md5sum | cut -c 1-8) /usr/local/x-ui/x-ui setting -username ${config_account} -password ${config_password} >/dev/null 2>&1 /usr/local/x-ui/x-ui setting -remove_secret >/dev/null 2>&1 - echo -e "Panel login username has been reset to: ${green} ${config_account} ${plain}" - echo -e "Panel login password has been reset to: ${green} ${config_password} ${plain}" - echo -e "${yellow} Panel login secret token disabled ${plain}" - echo -e "${green} Please use the new login username and password to access the X-UI panel. Also remember them! ${plain}" + echo -e "面板登录用户名已重置为:${green} ${config_account} ${plain}" + echo -e "面板登录密码已重置为:${green} ${config_password} ${plain}" + echo -e "${yellow} 面板 Secret Token 已禁用 ${plain}" + echo -e "${green} 请使用新的登录用户名和密码访问 X-UI 面板。也请记住它们!${plain}" confirm_restart } reset_config() { - confirm "Are you sure you want to reset all panel settings, Account data will not be lost, Username and password will not change" "n" + confirm "您确定要重置所有面板设置,帐户数据不会丢失,用户名和密码不会更改" "n" if [[ $? != 0 ]]; then if [[ $# == 0 ]]; then show_menu @@ -231,27 +234,27 @@ reset_config() { return 0 fi /usr/local/x-ui/x-ui setting -reset - echo -e "All panel settings have been reset to default, Please restart the panel now, and use the default ${green}2053${plain} Port to Access the web Panel" + echo -e "所有面板设置已重置为默认,请立即重新启动面板,并使用默认的${green}2053${plain}端口访问网页面板" confirm_restart } check_config() { info=$(/usr/local/x-ui/x-ui setting -show true) if [[ $? != 0 ]]; then - LOGE "get current settings error, please check logs" + LOGE "获取当前设置错误,请检查日志" show_menu fi LOGI "${info}" } set_port() { - echo && echo -n -e "Enter port number[1-65535]: " && read port + echo && echo -n -e "输入端口号 [1-65535]: " && read port if [[ -z "${port}" ]]; then LOGD "Cancelled" before_show_menu else /usr/local/x-ui/x-ui setting -port ${port} - echo -e "The port is set, Please restart the panel now, and use the new port ${green}${port}${plain} to access web panel" + echo -e "端口已设置,请立即重启面板,并使用新端口 ${green}${port}${plain} 以访问面板" confirm_restart fi } @@ -260,15 +263,15 @@ start() { check_status if [[ $? == 0 ]]; then echo "" - LOGI "Panel is running, No need to start again, If you need to restart, please select restart" + LOGI "面板正在运行,无需再次启动,如需重新启动,请选择重新启动" else systemctl start x-ui sleep 2 check_status if [[ $? == 0 ]]; then - LOGI "x-ui Started Successfully" + LOGI "x-ui 已成功启动" else - LOGE "panel Failed to start, Probably because it takes longer than two seconds to start, Please check the log information later" + LOGE "面板启动失败,可能是启动时间超过两秒,请稍后查看日志信息" fi fi @@ -281,15 +284,15 @@ stop() { check_status if [[ $? == 1 ]]; then echo "" - LOGI "Panel stopped, No need to stop again!" + LOGI "面板已关闭,无需再次关闭!" else systemctl stop x-ui sleep 2 check_status if [[ $? == 1 ]]; then - LOGI "x-ui and xray stopped successfully" + LOGI "x-ui 和 xray 已成功关闭" else - LOGE "Panel stop failed, Probably because the stop time exceeds two seconds, Please check the log information later" + LOGE "面板关闭失败,可能是停止时间超过两秒,请稍后查看日志信息" fi fi @@ -303,9 +306,9 @@ restart() { sleep 2 check_status if [[ $? == 0 ]]; then - LOGI "x-ui and xray Restarted successfully" + LOGI "x-ui and xray 已成功重启" else - LOGE "Panel restart failed, Probably because it takes longer than two seconds to start, Please check the log information later" + LOGE "面板重启失败,可能是启动时间超过两秒,请稍后查看日志信息" fi if [[ $# == 0 ]]; then before_show_menu @@ -322,9 +325,9 @@ status() { enable() { systemctl enable x-ui if [[ $? == 0 ]]; then - LOGI "x-ui Set to boot automatically on startup successfully" + LOGI "x-ui 已成功设置开机启动" else - LOGE "x-ui Failed to set Autostart" + LOGE "x-ui 设置开机启动失败" fi if [[ $# == 0 ]]; then @@ -335,9 +338,9 @@ enable() { disable() { systemctl disable x-ui if [[ $? == 0 ]]; then - LOGI "x-ui Autostart Cancelled successfully" + LOGI "x-ui 已成功取消开机启动" else - LOGE "x-ui Failed to cancel autostart" + LOGE "x-ui 取消开机启动失败" fi if [[ $# == 0 ]]; then @@ -357,18 +360,18 @@ show_banlog() { if [[ -s "${iplimit_banned_log_path}" ]]; then cat ${iplimit_banned_log_path} else - echo -e "${red}Log file is empty.${plain}\n" + echo -e "${red}日志文件为空${plain}\n" fi else - echo -e "${red}Log file not found. Please Install Fail2ban and IP Limit first.${plain}\n" + echo -e "${red}未找到日志文件。 请先安装 Fail2ban 和 IP Limit${plain}\n" fi } bbr_menu() { - echo -e "${green}\t1.${plain} Enable BBR" - echo -e "${green}\t2.${plain} Disable BBR" - echo -e "${green}\t0.${plain} Back to Main Menu" - read -p "Choose an option: " choice + echo -e "${green}\t1.${plain} 启用 BBR" + echo -e "${green}\t2.${plain} 禁用 BBR" + echo -e "${green}\t0.${plain} 返回主菜单" + read -p "请输入选项: " choice case "$choice" in 0) show_menu @@ -379,14 +382,13 @@ bbr_menu() { 2) disable_bbr ;; - *) echo "Invalid choice" ;; + *) echo "无效选项" ;; esac } disable_bbr() { - if ! grep -q "net.core.default_qdisc=fq" /etc/sysctl.conf || ! grep -q "net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf; then - echo -e "${yellow}BBR is not currently enabled.${plain}" + echo -e "${yellow}BBR 当前未启用${plain}" exit 0 fi @@ -399,15 +401,15 @@ disable_bbr() { # Verify that BBR is replaced with CUBIC if [[ $(sysctl net.ipv4.tcp_congestion_control | awk '{print $3}') == "cubic" ]]; then - echo -e "${green}BBR has been replaced with CUBIC successfully.${plain}" + echo -e "${green}BBR 已成功替换为 CUBIC${plain}" else - echo -e "${red}Failed to replace BBR with CUBIC. Please check your system configuration.${plain}" + echo -e "${red}用 CUBIC 替换 BBR 失败,请检查您的系统配置。${plain}" fi } enable_bbr() { if grep -q "net.core.default_qdisc=fq" /etc/sysctl.conf && grep -q "net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf; then - echo -e "${green}BBR is already enabled!${plain}" + echo -e "${green}BBR 已经启用!${plain}" exit 0 fi @@ -422,11 +424,11 @@ enable_bbr() { fedora) dnf -y update && dnf -y install ca-certificates ;; - arch | manjaro | parch) + arch | manjaro) pacman -Sy --noconfirm ca-certificates ;; *) - echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n" + echo -e "${red}不支持的操作系统。请检查脚本并手动安装必要的软件包${plain}\n" exit 1 ;; esac @@ -440,21 +442,21 @@ enable_bbr() { # Verify that BBR is enabled if [[ $(sysctl net.ipv4.tcp_congestion_control | awk '{print $3}') == "bbr" ]]; then - echo -e "${green}BBR has been enabled successfully.${plain}" + echo -e "${green}BBR 已成功启用${plain}" else - echo -e "${red}Failed to enable BBR. Please check your system configuration.${plain}" + echo -e "${red}启用 BBR 失败,请检查您的系统配置${plain}" fi } update_shell() { - wget -O /usr/bin/x-ui -N --no-check-certificate https://github.com/MHSanaei/3x-ui/raw/main/x-ui.sh + wget -O /usr/bin/x-ui -N --no-check-certificate https://github.com/Misaka-blog/3x-ui/raw/main/x-ui.sh if [[ $? != 0 ]]; then echo "" - LOGE "Failed to download script, Please check whether the machine can connect Github" + LOGE "下载脚本失败,请检查机器是否可以连接至 GitHub" before_show_menu else chmod +x /usr/bin/x-ui - LOGI "Upgrade script succeeded, Please rerun the script" && exit 0 + LOGI "升级脚本成功,请重新运行脚本" && exit 0 fi } @@ -484,7 +486,7 @@ check_uninstall() { check_status if [[ $? != 2 ]]; then echo "" - LOGE "Panel installed, Please do not reinstall" + LOGE "面板已安装,请勿重新安装" if [[ $# == 0 ]]; then before_show_menu fi @@ -498,7 +500,7 @@ check_install() { check_status if [[ $? == 2 ]]; then echo "" - LOGE "Please install the panel first" + LOGE "请先安装面板" if [[ $# == 0 ]]; then before_show_menu fi @@ -512,15 +514,15 @@ show_status() { check_status case $? in 0) - echo -e "Panel state: ${green}Running${plain}" + echo -e "面板状态: ${green}运行中${plain}" show_enable_status ;; 1) - echo -e "Panel state: ${yellow}Not Running${plain}" + echo -e "面板状态: ${yellow}未运行${plain}" show_enable_status ;; 2) - echo -e "Panel state: ${red}Not Installed${plain}" + echo -e "面板状态: ${red}未安装${plain}" ;; esac show_xray_status @@ -529,9 +531,9 @@ show_status() { show_enable_status() { check_enabled if [[ $? == 0 ]]; then - echo -e "Start automatically: ${green}Yes${plain}" + echo -e "开机启动: ${green}是${plain}" else - echo -e "Start automatically: ${red}No${plain}" + echo -e "开机启动: ${red}否${plain}" fi } @@ -547,19 +549,19 @@ check_xray_status() { show_xray_status() { check_xray_status if [[ $? == 0 ]]; then - echo -e "xray state: ${green}Running${plain}" + echo -e "xray 状态: ${green}运行中${plain}" else - echo -e "xray state: ${red}Not Running${plain}" + echo -e "xray 状态: ${red}未运行${plain}" fi } firewall_menu() { - echo -e "${green}\t1.${plain} Install Firewall & open ports" - echo -e "${green}\t2.${plain} Allowed List" - echo -e "${green}\t3.${plain} Delete Ports from List" - echo -e "${green}\t4.${plain} Disable Firewall" - echo -e "${green}\t0.${plain} Back to Main Menu" - read -p "Choose an option: " choice + echo -e "${green}\t1.${plain} 安装防火墙并开放端口" + echo -e "${green}\t2.${plain} 允许列表" + echo -e "${green}\t3.${plain} 从列表中删除端口" + echo -e "${green}\t4.${plain} 禁用防火墙" + echo -e "${green}\t0.${plain} 返回主菜单" + read -p "请输入选项: " choice case "$choice" in 0) show_menu @@ -576,24 +578,23 @@ firewall_menu() { 4) sudo ufw disable ;; - *) echo "Invalid choice" ;; + *) echo "无效选项" ;; esac } open_ports() { if ! command -v ufw &>/dev/null; then - echo "ufw firewall is not installed. Installing now..." + echo "ufw 防火墙未安装,正在安装..." apt-get update apt-get install -y ufw else - echo "ufw firewall is already installed" + echo "ufw 防火墙已安装" fi # Check if the firewall is inactive if ufw status | grep -q "Status: active"; then - echo "Firewall is already active" + echo "防火墙已经激活" else - echo "Activating firewall..." # Open the necessary ports ufw allow ssh ufw allow http @@ -605,11 +606,11 @@ open_ports() { fi # Prompt the user to enter a list of ports - read -p "Enter the ports you want to open (e.g. 80,443,2053 or range 400-500): " ports + read -p "输入您要打开的端口(例如 80,443,2053 或端口范围 400-500): " ports # Check if the input is valid if ! [[ $ports =~ ^([0-9]+|[0-9]+-[0-9]+)(,([0-9]+|[0-9]+-[0-9]+))*$ ]]; then - echo "Error: Invalid input. Please enter a comma-separated list of ports or a range of ports (e.g. 80,443,2053 or 400-500)." >&2 + echo "错误:输入无效。请输入以逗号分隔的端口列表或端口范围(例如 80,443,2053 或 400-500)" >&2 exit 1 fi @@ -620,28 +621,26 @@ open_ports() { # Split the range into start and end ports start_port=$(echo $port | cut -d'-' -f1) end_port=$(echo $port | cut -d'-' -f2) - ufw allow $start_port:$end_port/tcp - ufw allow $start_port:$end_port/udp + # Loop through the range and open each port + for ((i = start_port; i <= end_port; i++)); do + ufw allow $i + done else ufw allow "$port" fi done # Confirm that the ports are open - echo "The following ports are now open:" - ufw status | grep "ALLOW" | grep -Eo "[0-9]+(/[a-z]+)?" - - echo "Firewall status:" - ufw status verbose + ufw status | grep $ports } delete_ports() { # Prompt the user to enter the ports they want to delete - read -p "Enter the ports you want to delete (e.g. 80,443,2053 or range 400-500): " ports + read -p "输入要删除的端口(例如 80,443,2053 或范围 400-500): " ports # Check if the input is valid if ! [[ $ports =~ ^([0-9]+|[0-9]+-[0-9]+)(,([0-9]+|[0-9]+-[0-9]+))*$ ]]; then - echo "Error: Invalid input. Please enter a comma-separated list of ports or a range of ports (e.g. 80,443,2053 or 400-500)." >&2 + echo "错误:输入无效。请输入以逗号分隔的端口列表或端口范围(例如 80,443,2053 或 400-500)" >&2 exit 1 fi @@ -652,37 +651,27 @@ delete_ports() { # Split the range into start and end ports start_port=$(echo $port | cut -d'-' -f1) end_port=$(echo $port | cut -d'-' -f2) - # Delete the port range - ufw delete allow $start_port:$end_port/tcp - ufw delete allow $start_port:$end_port/udp + # Loop through the range and delete each port + for ((i = start_port; i <= end_port; i++)); do + ufw delete allow $i + done else ufw delete allow "$port" fi done # Confirm that the ports are deleted - - echo "Deleted the specified ports:" - for port in "${PORT_LIST[@]}"; do - if [[ $port == *-* ]]; then - start_port=$(echo $port | cut -d'-' -f1) - end_port=$(echo $port | cut -d'-' -f2) - # Check if the port range has been successfully deleted - (ufw status | grep -q "$start_port:$end_port") || echo "$start_port-$end_port" - else - # Check if the individual port has been successfully deleted - (ufw status | grep -q "$port") || echo "$port" - fi - done + echo "删除指定端口:" + ufw status | grep $ports } update_geo() { local defaultBinFolder="/usr/local/x-ui/bin" - read -p "Please enter x-ui bin folder path. Leave blank for default. (Default: '${defaultBinFolder}')" binFolder + read -p "请输入 x-ui bin 文件夹路径,默认留空。(默认值:'${defaultBinFolder}')" binFolder binFolder=${binFolder:-${defaultBinFolder}} if [[ ! -d ${binFolder} ]]; then - LOGE "Folder ${binFolder} not exists!" - LOGI "making bin folder: ${binFolder}..." + LOGE "文件夹 ${binFolder} 不存在!" + LOGI "制作 bin 文件夹:${binFolder}..." mkdir -p ${binFolder} fi @@ -696,7 +685,7 @@ update_geo() { wget -O geoip_VN.dat https://github.com/vuong2023/vn-v2ray-rules/releases/latest/download/geoip.dat wget -O geosite_VN.dat https://github.com/vuong2023/vn-v2ray-rules/releases/latest/download/geosite.dat systemctl start x-ui - echo -e "${green}Geosite.dat + Geoip.dat + geoip_IR.dat + geosite_IR.dat have been updated successfully in bin folder '${binfolder}'!${plain}" + echo -e "${green}Geosite.dat + Geoip.dat + geoip_IR.dat + geosite_IR.dat 在 bin 文件夹: '${binfolder}' 中已经更新成功 !${plain}" before_show_menu } @@ -705,20 +694,20 @@ install_acme() { LOGI "install acme..." curl https://get.acme.sh | sh if [ $? -ne 0 ]; then - LOGE "install acme failed" + LOGE "安装 acme 失败" return 1 else - LOGI "install acme succeed" + LOGI "安装 acme 成功" fi return 0 } ssl_cert_issue_main() { - echo -e "${green}\t1.${plain} Get SSL" - echo -e "${green}\t2.${plain} Revoke" - echo -e "${green}\t3.${plain} Force Renew" - echo -e "${green}\t0.${plain} Back to Main Menu" - read -p "Choose an option: " choice + echo -e "${green}\t1.${plain} 获取 SSL 证书" + echo -e "${green}\t2.${plain} 吊销证书" + echo -e "${green}\t3.${plain} 续签证书" + echo -e "${green}\t0.${plain} 返回主菜单" + read -p "请输入选项: " choice case "$choice" in 0) show_menu @@ -728,26 +717,26 @@ ssl_cert_issue_main() { ;; 2) local domain="" - read -p "Please enter your domain name to revoke the certificate: " domain + read -p "请输入您的域名以吊销证书: " domain ~/.acme.sh/acme.sh --revoke -d ${domain} - LOGI "Certificate revoked" + LOGI "证书吊销成功" ;; 3) local domain="" - read -p "Please enter your domain name to forcefully renew an SSL certificate: " domain + read -p "请输入您的域名以续签 SSL 证书: " domain ~/.acme.sh/acme.sh --renew -d ${domain} --force ;; - *) echo "Invalid choice" ;; + *) echo "无效选项" ;; esac } ssl_cert_issue() { # check for acme.sh first if ! command -v ~/.acme.sh/acme.sh &>/dev/null; then - echo "acme.sh could not be found. we will install it" + echo "未找到 acme.sh, 正在安装" install_acme if [ $? -ne 0 ]; then - LOGE "install acme failed, please check logs" + LOGE "安装 acme 失败,请检查日志" exit 1 fi fi @@ -762,35 +751,35 @@ ssl_cert_issue() { fedora) dnf -y update && dnf -y install socat ;; - arch | manjaro | parch) + arch | manjaro) pacman -Sy --noconfirm socat ;; *) - echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n" + echo -e "${red}不支持的操作系统,请检查脚本并手动安装必要的软件包。${plain}\n" exit 1 ;; esac if [ $? -ne 0 ]; then - LOGE "install socat failed, please check logs" + LOGE "安装 socat 失败,请检查日志" exit 1 else - LOGI "install socat succeed..." + LOGI "安装 socat 成功..." fi # get the domain here,and we need verify it local domain="" - read -p "Please enter your domain name:" domain - LOGD "your domain is:${domain},check it..." + read -p "请输入您的域名:" domain + LOGD "您的域名是:${domain},正在检查..." # here we need to judge whether there exists cert already local currentCert=$(~/.acme.sh/acme.sh --list | tail -1 | awk '{print $1}') if [ ${currentCert} == ${domain} ]; then local certInfo=$(~/.acme.sh/acme.sh --list) - LOGE "system already has certs here,can not issue again,current certs details:" + LOGE "系统已经有证书,无法再次颁发,当前证书详细信息:" LOGI "$certInfo" exit 1 else - LOGI "your domain is ready for issuing cert now..." + LOGI "您的域现在已准备好颁发证书..." fi # create a directory for install cert @@ -804,21 +793,21 @@ ssl_cert_issue() { # get needed port here local WebPort=80 - read -p "please choose which port do you use,default will be 80 port:" WebPort + read -p "请选择您使用的端口,默认为 80 端口:" WebPort if [[ ${WebPort} -gt 65535 || ${WebPort} -lt 1 ]]; then - LOGE "your input ${WebPort} is invalid,will use default port" + LOGE "您输入的端口 ${WebPort} 无效,将使用默认端口" fi - LOGI "will use port:${WebPort} to issue certs,please make sure this port is open..." + LOGI "将使用端口:${WebPort} 来颁发证书,请确保该端口已开启..." # NOTE:This should be handled by user # open the port and kill the occupied progress ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt ~/.acme.sh/acme.sh --issue -d ${domain} --standalone --httpport ${WebPort} if [ $? -ne 0 ]; then - LOGE "issue certs failed,please check logs" + LOGE "颁发证书失败,请检查日志" rm -rf ~/.acme.sh/${domain} exit 1 else - LOGE "issue certs succeed,installing certs..." + LOGE "颁发证书成功,安装证书..." fi # install cert ~/.acme.sh/acme.sh --installcert -d ${domain} \ @@ -826,21 +815,21 @@ ssl_cert_issue() { --fullchain-file /root/cert/${domain}/fullchain.pem if [ $? -ne 0 ]; then - LOGE "install certs failed,exit" + LOGE "安装证书失败" rm -rf ~/.acme.sh/${domain} exit 1 else - LOGI "install certs succeed,enable auto renew..." + LOGI "安装证书成功,启用自动续订..." fi ~/.acme.sh/acme.sh --upgrade --auto-upgrade if [ $? -ne 0 ]; then - LOGE "auto renew failed, certs details:" + LOGE "自动续订失败,证书详细信息:" ls -lah cert/* chmod 755 $certPath/* exit 1 else - LOGI "auto renew succeed, certs details:" + LOGI "自动续订成功,证书详细信息:" ls -lah cert/* chmod 755 $certPath/* fi @@ -848,20 +837,20 @@ ssl_cert_issue() { ssl_cert_issue_CF() { echo -E "" - LOGD "******Instructions for use******" - LOGI "This Acme script requires the following data:" - LOGI "1.Cloudflare Registered e-mail" - LOGI "2.Cloudflare Global API Key" - LOGI "3.The domain name that has been resolved dns to the current server by Cloudflare" - LOGI "4.The script applies for a certificate. The default installation path is /root/cert " - confirm "Confirmed?[y/n]" "y" + LOGD "******使用说明******" + LOGI "此 Acme 脚本需要以下数据:" + LOGI "1. Cloudflare 注册邮箱" + LOGI "2. Cloudflare 全局 API 密钥" + LOGI "3. Cloudflare 已解析 dns 到当前服务器的域名" + LOGI "4. 脚本申请证书,默认安装路径为 /root/cert " + confirm "确认申请? [y/n]" "y" if [ $? -eq 0 ]; then # check for acme.sh first if ! command -v ~/.acme.sh/acme.sh &>/dev/null; then - echo "acme.sh could not be found. we will install it" + echo "未找到 acme.sh, 正在安装" install_acme if [ $? -ne 0 ]; then - LOGE "install acme failed, please check logs" + LOGE "安装 acme 失败,请检查日志" exit 1 fi fi @@ -875,46 +864,46 @@ ssl_cert_issue_CF() { rm -rf $certPath mkdir $certPath fi - LOGD "Please set a domain name:" - read -p "Input your domain here:" CF_Domain - LOGD "Your domain name is set to:${CF_Domain}" - LOGD "Please set the API key:" - read -p "Input your key here:" CF_GlobalKey - LOGD "Your API key is:${CF_GlobalKey}" - LOGD "Please set up registered email:" - read -p "Input your email here:" CF_AccountEmail - LOGD "Your registered email address is:${CF_AccountEmail}" + LOGD "请设置域名:" + read -p "在此输入您的域名:" CF_Domain + LOGD "您的域名为: ${CF_Domain}" + LOGD "请设置 CF Global API Key:" + read -p "在此输入您的 API Key:" CF_GlobalKey + LOGD "您的 API 密钥是: ${CF_GlobalKey}" + LOGD "请设置注册邮箱:" + read -p "在此输入您的邮箱:" CF_AccountEmail + LOGD "您的账号邮箱地址是: ${CF_AccountEmail}" ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt if [ $? -ne 0 ]; then - LOGE "Default CA, Lets'Encrypt fail, script exiting..." + LOGE "默认 CA: Lets'Encrypt 失败,脚本退出..." exit 1 fi export CF_Key="${CF_GlobalKey}" export CF_Email=${CF_AccountEmail} ~/.acme.sh/acme.sh --issue --dns dns_cf -d ${CF_Domain} -d *.${CF_Domain} --log if [ $? -ne 0 ]; then - LOGE "Certificate issuance failed, script exiting..." + LOGE "证书颁发失败,脚本退出..." exit 1 else - LOGI "Certificate issued Successfully, Installing..." + LOGI "证书颁发成功,正在安装..." fi ~/.acme.sh/acme.sh --installcert -d ${CF_Domain} -d *.${CF_Domain} --ca-file /root/cert/ca.cer \ --cert-file /root/cert/${CF_Domain}.cer --key-file /root/cert/${CF_Domain}.key \ --fullchain-file /root/cert/fullchain.cer if [ $? -ne 0 ]; then - LOGE "Certificate installation failed, script exiting..." + LOGE "证书安装失败,脚本退出..." exit 1 else - LOGI "Certificate installed Successfully,Turning on automatic updates..." + LOGI "证书安装成功,开启自动更新..." fi ~/.acme.sh/acme.sh --upgrade --auto-upgrade if [ $? -ne 0 ]; then - LOGE "Auto update setup Failed, script exiting..." + LOGE "自动更新设置失败,脚本退出..." ls -lah cert chmod 755 $certPath exit 1 else - LOGI "The certificate is installed and auto-renewal is turned on, Specific information is as follows" + LOGI "证书已安装并开启自动续订,具体信息如下:" ls -lah cert chmod 755 $certPath fi @@ -924,12 +913,12 @@ ssl_cert_issue_CF() { } warp_cloudflare() { - echo -e "${green}\t1.${plain} Install WARP socks5 proxy" - echo -e "${green}\t2.${plain} Account Type (free, plus, team)" - echo -e "${green}\t3.${plain} Turn on/off WireProxy" - echo -e "${green}\t4.${plain} Uninstall WARP" - echo -e "${green}\t0.${plain} Back to Main Menu" - read -p "Choose an option: " choice + echo -e "${green}\t1.${plain} 安装 WARP socks5 代理" + echo -e "${green}\t2.${plain} 账户类型 (free, plus, team)" + echo -e "${green}\t3.${plain} 开启 / 关闭 WireProxy" + echo -e "${green}\t4.${plain} 卸载 WARP" + echo -e "${green}\t0.${plain} 返回主菜单" + read -p "请输入选项: " choice case "$choice" in 0) show_menu @@ -946,7 +935,7 @@ warp_cloudflare() { 4) warp u ;; - *) echo "Invalid choice" ;; + *) echo "无效选项" ;; esac } @@ -972,7 +961,7 @@ run_speedtest() { fi if [[ -z $pkg_manager ]]; then - echo "Error: Package manager not found. You may need to install Speedtest manually." + echo "错误:找不到包管理器。 您可能需要手动安装 Speedtest" return 1 else curl -s $speedtest_install_script | bash @@ -1039,7 +1028,7 @@ actionunban = -D f2b- -s -j [Init] EOF - echo -e "${green}Ip Limit jail files created with a bantime of ${bantime} minutes.${plain}" + echo -e "${green}使用 ${bantime} 分钟的禁止时间以创建的 IP Limit 限制文件。${plain}" } iplimit_remove_conflicts() { @@ -1052,26 +1041,26 @@ iplimit_remove_conflicts() { # Check for [3x-ipl] config in jail file then remove it if test -f "${file}" && grep -qw '3x-ipl' ${file}; then sed -i "/\[3x-ipl\]/,/^$/d" ${file} - echo -e "${yellow}Removing conflicts of [3x-ipl] in jail (${file})!${plain}\n" + echo -e "${yellow}消除监狱中 [3x-ipl] 的冲突 (${file})!${plain}\n" fi done } iplimit_main() { - echo -e "\n${green}\t1.${plain} Install Fail2ban and configure IP Limit" - echo -e "${green}\t2.${plain} Change Ban Duration" - echo -e "${green}\t3.${plain} Unban Everyone" - echo -e "${green}\t4.${plain} Check Logs" - echo -e "${green}\t5.${plain} fail2ban status" - echo -e "${green}\t6.${plain} Uninstall IP Limit" - echo -e "${green}\t0.${plain} Back to Main Menu" - read -p "Choose an option: " choice + echo -e "\n${green}\t1.${plain} 安装 Fail2ban 并配置 IP 限制" + echo -e "${green}\t2.${plain} 更改禁止期限" + echo -e "${green}\t3.${plain} 解禁所有 IP" + echo -e "${green}\t4.${plain} 查看日志" + echo -e "${green}\t5.${plain} Fail2ban 状态" + echo -e "${green}\t6.${plain} 卸载 IP 限制" + echo -e "${green}\t0.${plain} 返回主菜单" + read -p "请输入选项: " choice case "$choice" in 0) show_menu ;; 1) - confirm "Proceed with installation of Fail2ban & IP Limit?" "y" + confirm "继续安装 Fail2ban 和 IP 限制?" "y" if [[ $? == 0 ]]; then install_iplimit else @@ -1079,24 +1068,24 @@ iplimit_main() { fi ;; 2) - read -rp "Please enter new Ban Duration in Minutes [default 30]: " NUM + read -rp "请输入新的禁令持续时间(以分钟为单位)[默认 30]: " NUM if [[ $NUM =~ ^[0-9]+$ ]]; then create_iplimit_jails ${NUM} systemctl restart fail2ban else - echo -e "${red}${NUM} is not a number! Please, try again.${plain}" + echo -e "${red}${NUM} 不是一个数字! 请再试一次.${plain}" fi iplimit_main ;; 3) - confirm "Proceed with Unbanning everyone from IP Limit jail?" "y" + confirm "继续解除所有人的 IP 限制禁令?" "y" if [[ $? == 0 ]]; then fail2ban-client reload --restart --unban 3x-ipl truncate -s 0 "${iplimit_banned_log_path}" - echo -e "${green}All users Unbanned successfully.${plain}" + echo -e "${green}所有用户已成功解封${plain}" iplimit_main else - echo -e "${yellow}Cancelled.${plain}" + echo -e "${yellow}已取消${plain}" fi iplimit_main ;; @@ -1110,13 +1099,13 @@ iplimit_main() { 6) remove_iplimit ;; - *) echo "Invalid choice" ;; + *) echo "无效选项" ;; esac } install_iplimit() { if ! command -v fail2ban-client &>/dev/null; then - echo -e "${green}Fail2ban is not installed. Installing now...!${plain}\n" + echo -e "${green}未安装 Fail2ban。正在安装...!${plain}\n" # Check the OS and install necessary packages case "${release}" in @@ -1130,26 +1119,26 @@ install_iplimit() { fedora) dnf -y update && dnf -y install fail2ban ;; - arch | manjaro | parch) + arch | manjaro) pacman -Syu --noconfirm fail2ban ;; *) - echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n" + echo -e "${red}不支持的操作系统,请检查脚本并手动安装必要的软件包.${plain}\n" exit 1 ;; esac if ! command -v fail2ban-client &>/dev/null; then - echo -e "${red}Fail2ban installation failed.${plain}\n" + echo -e "${red}Fail2ban 安装失败${plain}\n" exit 1 fi - echo -e "${green}Fail2ban installed successfully!${plain}\n" + echo -e "${green}Fail2ban 安装成功!${plain}\n" else - echo -e "${yellow}Fail2ban is already installed.${plain}\n" + echo -e "${yellow}Fail2ban 已安装${plain}\n" fi - echo -e "${green}Configuring IP Limit...${plain}\n" + echo -e "${green}配置 IP 限制中...${plain}\n" # make sure there's no conflict for jail files iplimit_remove_conflicts @@ -1177,22 +1166,22 @@ install_iplimit() { fi systemctl enable fail2ban - echo -e "${green}IP Limit installed and configured successfully!${plain}\n" + echo -e "${green}IP 限制安装并配置成功!${plain}\n" before_show_menu } remove_iplimit() { - echo -e "${green}\t1.${plain} Only remove IP Limit configurations" - echo -e "${green}\t2.${plain} Uninstall Fail2ban and IP Limit" - echo -e "${green}\t0.${plain} Abort" - read -p "Choose an option: " num + echo -e "${green}\t1.${plain} 仅删除 IP 限制配置" + echo -e "${green}\t2.${plain} 卸载 Fail2ban 和 IP 限制" + echo -e "${green}\t0.${plain} 终止" + read -p "请输入选项: " num case "$num" in 1) rm -f /etc/fail2ban/filter.d/3x-ipl.conf rm -f /etc/fail2ban/action.d/3x-ipl.conf rm -f /etc/fail2ban/jail.d/3x-ipl.conf systemctl restart fail2ban - echo -e "${green}IP Limit removed successfully!${plain}\n" + echo -e "${green}IP 限制成功解除!${plain}\n" before_show_menu ;; 2) @@ -1212,82 +1201,82 @@ remove_iplimit() { dnf remove fail2ban -y dnf autoremove -y ;; - arch | manjaro | parch) + arch | manjaro) pacman -Rns --noconfirm fail2ban ;; *) - echo -e "${red}Unsupported operating system. Please uninstall Fail2ban manually.${plain}\n" + echo -e "${red}不支持的操作系统,请手动卸载 Fail2ban.${plain}\n" exit 1 ;; esac - echo -e "${green}Fail2ban and IP Limit removed successfully!${plain}\n" + echo -e "${green}Fail2ban 和 IP 限制已成功删除!${plain}\n" before_show_menu ;; 0) - echo -e "${yellow}Cancelled.${plain}\n" + echo -e "${yellow}已取消${plain}\n" iplimit_main ;; *) - echo -e "${red}Invalid option. Please select a valid number.${plain}\n" + echo -e "${red}无效选项。 请选择一个有效的选项。${plain}\n" remove_iplimit ;; esac } show_usage() { - echo "x-ui control menu usages: " - echo "------------------------------------------" - echo -e "x-ui - Enter control menu" - echo -e "x-ui start - Start x-ui " - echo -e "x-ui stop - Stop x-ui " - echo -e "x-ui restart - Restart x-ui " - echo -e "x-ui status - Show x-ui status" - echo -e "x-ui enable - Enable x-ui on system startup" - echo -e "x-ui disable - Disable x-ui on system startup" - echo -e "x-ui log - Check x-ui logs" - echo -e "x-ui banlog - Check Fail2ban ban logs" - echo -e "x-ui update - Update x-ui " - echo -e "x-ui install - Install x-ui " - echo -e "x-ui uninstall - Uninstall x-ui " - echo "------------------------------------------" + echo -e "x-ui 控制菜单用法: " + echo -e "----------------------------------------------" + echo -e "x-ui - 进入管理脚本" + echo -e "x-ui start - 启动 x-ui" + echo -e "x-ui stop - 关闭 x-ui" + echo -e "x-ui restart - 重启 x-ui" + echo -e "x-ui status - 查看 x-ui 状态" + echo -e "x-ui enable - 启用 x-ui 开机启动" + echo -e "x-ui disable - 禁用 x-ui 开机启动" + echo -e "x-ui log - 查看 x-ui 运行日志" + echo -e "x-ui banlog - 检查 Fail2ban 禁止日志" + echo -e "x-ui update - 更新 x-ui" + echo -e "x-ui install - 安装 x-ui" + echo -e "x-ui uninstall - 卸载 x-ui" + echo -e "----------------------------------------------" } show_menu() { echo -e " - ${green}3X-ui Panel Management Script${plain} - ${green}0.${plain} Exit Script + ${green}3X-ui 面板管理脚本${plain} + ${green}0.${plain} 退出脚本 ———————————————— - ${green}1.${plain} Install - ${green}2.${plain} Update - ${green}3.${plain} Custom Version - ${green}4.${plain} Uninstall + ${green}1.${plain} 安装面板 + ${green}2.${plain} 更新面板 + ${green}3.${plain} 自定义版本 + ${green}4.${plain} 卸载面板 ———————————————— - ${green}5.${plain} Reset Username & Password & Secret Token - ${green}6.${plain} Reset Settings - ${green}7.${plain} Change Port - ${green}8.${plain} View Current Settings + ${green}5.${plain} 重置用户名、密码和 Secret Token + ${green}6.${plain} 重置面板设置 + ${green}7.${plain} 修改面板端口 + ${green}8.${plain} 查看面板设置 ———————————————— - ${green}9.${plain} Start - ${green}10.${plain} Stop - ${green}11.${plain} Restart - ${green}12.${plain} Check Status - ${green}13.${plain} Check Logs + ${green}9.${plain} 启动面板 + ${green}10.${plain} 关闭面板 + ${green}11.${plain} 重启面板 + ${green}12.${plain} 检查面板状态 + ${green}13.${plain} 检查面板日志 ———————————————— - ${green}14.${plain} Enable Autostart - ${green}15.${plain} Disable Autostart + ${green}14.${plain} 启用开机启动 + ${green}15.${plain} 禁用开机启动 ———————————————— - ${green}16.${plain} SSL Certificate Management - ${green}17.${plain} Cloudflare SSL Certificate - ${green}18.${plain} IP Limit Management - ${green}19.${plain} WARP Management - ${green}20.${plain} Firewall Management + ${green}16.${plain} SSL 证书管理 + ${green}17.${plain} CF SSL 证书 + ${green}18.${plain} IP 限制管理 + ${green}19.${plain} WARP 管理 + ${green}20.${plain} 防火墙管理 ———————————————— - ${green}21.${plain} Enable BBR - ${green}22.${plain} Update Geo Files + ${green}21.${plain} 启用 BBR + ${green}22.${plain} 更新 Geo 文件 ${green}23.${plain} Speedtest by Ookla " show_status - echo && read -p "Please enter your selection [0-23]: " num + echo && read -p "请输入选项 [0-23]: " num case "${num}" in 0) @@ -1363,7 +1352,7 @@ show_menu() { run_speedtest ;; *) - LOGE "Please enter the correct number [0-23]" + LOGE "请输入正确的选项 [0-23]" ;; esac }