From 933d03caa53d3cb44c0431aef609400f28d115ca Mon Sep 17 00:00:00 2001 From: yunshu Date: Tue, 4 Mar 2025 19:56:42 +0800 Subject: [PATCH] fix bugs --- fail2ban_manager.sh | 117 +++++++++++++++++----------------- file_manager.sh | 48 ++++---------- install.sh | 152 ++++++++++++++++++++++---------------------- 3 files changed, 147 insertions(+), 170 deletions(-) diff --git a/fail2ban_manager.sh b/fail2ban_manager.sh index 4557402..daa8d7a 100644 --- a/fail2ban_manager.sh +++ b/fail2ban_manager.sh @@ -1,32 +1,33 @@ #!/bin/bash # 定义当前版本号 -mf_SCRIPT_VERSION="1.1.1" +mf_SCRIPT_VERSION="1.1.2" mf_main_menu() { check_system - - echo -e "\n" - log_echo "${GreenBG} $(gettext "设置") Fail2ban $(gettext 用于防止暴力破解"), $(gettext 请选择"): ${Font}" - log_echo "1. ${Green}$(gettext "安装") Fail2ban${Font}" - log_echo "2. ${Green}$(gettext "管理") Fail2ban${Font}" - log_echo "3. ${Green}$(gettext "卸载") Fail2ban${Font}" - log_echo "4. ${Green}$(gettext "查看") Fail2ban $(gettext "状态")${Font}" - log_echo "5. ${Green}$(gettext "退出")${Font}" - read -rp "$(gettext "请输入"):" fail2ban_fq - [[ -z "${fail2ban_fq}" ]] && fail2ban_fq=1 - - case $fail2ban_fq in - 1) mf_install_fail2ban ;; - 2) mf_manage_fail2ban ;; - 3) mf_uninstall_fail2ban ;; - 4) mf_display_fail2ban_status ;; - 5) source "${idleleo}" ;; - *) - echo -e "\n" - log_echo "${Error} ${RedBG} $(gettext "无效的选择请重试") ${Font}" - ;; - esac + while true; do + echo + log_echo "${GreenBG} $(gettext "设置") Fail2ban $(gettext "用于防止暴力破解") ${Font}" + log_echo "${Green} $(gettext "主菜单") ${Font}" + log_echo "1. ${Green}$(gettext "安装") Fail2ban${Font}" + log_echo "2. ${Green}$(gettext "管理") Fail2ban${Font}" + log_echo "3. ${Green}$(gettext "卸载") Fail2ban${Font}" + log_echo "4. ${Green}$(gettext "查看") Fail2ban $(gettext "状态")${Font}" + log_echo "5. ${Green}$(gettext "退出")${Font}" + local fail2ban_fq + read_optimize "$(gettext "请选择一个选项"):" fail2ban_fq "" 1 5 + case $fail2ban_fq in + 1) mf_install_fail2ban ;; + 2) mf_manage_fail2ban ;; + 3) mf_uninstall_fail2ban ;; + 4) mf_display_fail2ban_status ;; + 5) source "${idleleo}" ;; + *) + echo + log_echo "${Error} ${RedBG} $(gettext "无效的选择请重试") ${Font}" + ;; + esac + done } mf_install_fail2ban() { @@ -93,36 +94,38 @@ mf_manage_fail2ban() { return fi - echo -e "\n" - log_echo "${Green} $(gettext "请选择") Fail2ban $(gettext "操作"): ${Font}" - echo "1. $(gettext "启动") Fail2ban" - echo "2. $(gettext "重启") Fail2ban" - echo "3. $(gettext "停止") Fail2ban" - echo "4. $(gettext "添加自定义规则")" - echo "5. $(gettext "返回")" - read_optimize "$(gettext "请输入"):" mf_action 1 - case $mf_action in - 1) - mf_start_enable_fail2ban - ;; - 2) - mf_restart_fail2ban - mf_main_menu - ;; - 3) - mf_stop_disable_fail2ban - ;; - 4) - mf_add_custom_rule - mf_main_menu - ;; - 5) mf_main_menu ;; - *) - echo -e "\n" - log_echo "${Error} ${RedBG} $(gettext "无效的选择请重试") ${Font}" - mf_manage_fail2ban - ;; - esac + while true; do + echo + log_echo "${Green} $(gettext "请选择") Fail2ban $(gettext "操作"): ${Font}" + echo "1. $(gettext "启动") Fail2ban" + echo "2. $(gettext "重启") Fail2ban" + echo "3. $(gettext "停止") Fail2ban" + echo "4. $(gettext "添加自定义规则")" + echo "5. $(gettext "返回")" + local mf_action + read_optimize "$(gettext "请输入"):" mf_action 1 + case $mf_action in + 1) + mf_start_enable_fail2ban + ;; + 2) + mf_restart_fail2ban + mf_main_menu + ;; + 3) + mf_stop_disable_fail2ban + ;; + 4) + mf_add_custom_rule + mf_main_menu + ;; + 5) mf_main_menu ;; + *) + echo + log_echo "${Error} ${RedBG} $(gettext "无效的选择请重试") ${Font}" + ;; + esac + done } mf_add_custom_rule() { @@ -199,7 +202,7 @@ mf_display_fail2ban_status() { log_echo "${GreenBG} Fail2ban $(gettext "总体状态"): ${Font}" fail2ban-client status - echo -e "\n" + echo log_echo "${Green} $(gettext "默认启用的 Jail 状态"): ${Font}" echo "----------------------------------------" log_echo "${Green} SSH $(gettext "封锁情况"): ${Font}" @@ -235,10 +238,10 @@ mf_check_for_updates() { if [ $? -eq 0 ]; then chmod +x "${idleleo_dir}/fail2ban_manager.sh" - log_echo "${OK} ${Green} $(gettext "下载完成, 正在重新运行脚本")... ${Font}" - bash "${idleleo}" --set-fail2ban + log_echo "${OK} ${GreenBG} $(gettext "下载完成, 请重新运行脚本") ${Font}" + bash "${idleleo}" else - echo -e "\n" + echo log_echo "${Error} ${RedBG} $(gettext "下载失败, 请手动下载并安装新版本") ${Font}" fi ;; diff --git a/file_manager.sh b/file_manager.sh index ab3aeb1..ae35741 100644 --- a/file_manager.sh +++ b/file_manager.sh @@ -3,7 +3,6 @@ # 定义当前版本号 fm_SCRIPT_VERSION="1.1.0" -# 检查是否提供了扩展名参数 if [ -z "$1" ]; then echo "$(gettext "用法"):" $0 <$(gettext "文件扩展名")> [<$(gettext "目录路径")>] exit 1 @@ -12,20 +11,16 @@ fi fm_EXTENSION="$1" fm_WORKDIR="${2:-$(pwd)}" -# 检查目录是否存在 if [ ! -d "$fm_WORKDIR" ]; then - echo -e "\n" + echo log_echo "${Error} ${RedBG} $(gettext "目录") $fm_WORKDIR $(gettext "不存在, 请检查路径") ${Font}" exit 1 fi -# 保存当前工作目录 fm_original_dir=$(pwd) -# 切换到工作目录 cd "$fm_WORKDIR" -# 函数: 列出当前目录下所有指定扩展名的文件 fm_list_files() { local max_length log_echo "${GreenBG} $(gettext "列出所有") .$fm_EXTENSION $(gettext "文件") ${Font}" @@ -40,7 +35,6 @@ fm_list_files() { log_echo "${Warning} ${YellowBG} $(gettext "没有找到") .$fm_EXTENSION $(gettext "文件") ${Font}" return 1 else - # 计算最大文件名长度 local max_length=0 for file in "${files[@]}"; do local length=${#file} @@ -49,18 +43,13 @@ fm_list_files() { fi done - # 确保最小宽度为 10 if (( max_length < 10 )); then max_length=10 fi - # 计算总宽度(包括边框) local total_width=$((max_length + 10)) - - # 打印表头 printf "%-${total_width}s\n" "$(printf '%*s' "$total_width" | tr ' ' '-')" - # 居中文本 local header_text="$(gettext "文件名")" local header_length=${#header_text} local padding=$(( (total_width - header_length - 4) / 2 )) @@ -71,30 +60,27 @@ fm_list_files() { printf "%-${total_width}s\n" "$(printf '%*s' "$total_width" | tr ' ' '-')" - # 打印文件名 local index=1 for file in "${files[@]}"; do printf "| %4d | %-*s |\n" $index $((max_length)) "$file" ((index++)) done - # 打印底部边框 printf "%-${total_width}s\n" "$(printf '%*s' "$total_width" | tr ' ' '-')" return 0 fi } -# 函数: 创建一个新的 serverNames 文件 fm_create_servername_file() { local url fm_list_files - echo -e "\n" + echo log_echo "${Green} $(gettext "请输入网址 (例如 hey.run)")" log_echo "${Green} $(gettext "不要包含 http:// 或 https:// 开头") ${Font}" read_optimize "$(gettext "请输入"):" url if [[ $url =~ ^(http|https):// ]]; then - echo -e "\n" + echo log_echo "${Error} ${RedBG} $(gettext "网址不能包含 http:// 或 https:// 开头") ${Font}" return fi @@ -104,7 +90,6 @@ fm_create_servername_file() { fm_list_files } -# 函数: 创建一个新的 wsServers 或 grpcServers 文件 fm_create_ws_or_grpc_server_file() { local host port weight content firewall_set_fq fm_list_files @@ -116,8 +101,7 @@ fm_create_ws_or_grpc_server_file() { echo "$content" > "${host}.${fm_EXTENSION}" log_echo "${OK} ${GreenBG} $(gettext "文件") ${host}.${fm_EXTENSION} $(gettext "已创建") ${Font}" - # 询问是否需要修改防火墙 - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要设置防火墙") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r firewall_set_fq case $firewall_set_fq in @@ -151,7 +135,6 @@ fm_create_ws_or_grpc_server_file() { fm_list_files } -# 函数: 编辑一个已存在的指定扩展名的文件 fm_edit_file() { fm_list_files local num_files=${#files[@]} @@ -160,7 +143,6 @@ fm_edit_file() { local filename="${files[$((choice - 1))]}" - # 检查 vim 是否安装 if ! command -v vim &> /dev/null; then log_echo "${Warning} ${YellowBG} vim $(gettext "未安装, 正在尝试安装") ${Font}" pkg_install vim @@ -170,7 +152,6 @@ fm_edit_file() { fm_restart_nginx_and_check_status } -# 函数: 删除一个已存在的指定扩展名的文件 fm_delete_file() { if ! fm_list_files; then return @@ -188,7 +169,6 @@ fm_delete_file() { fm_list_files } -# 根据扩展名选择创建文件的方式 fm_create_file() { case $fm_EXTENSION in serverNames) @@ -198,13 +178,12 @@ fm_create_file() { fm_create_ws_or_grpc_server_file ;; *) - echo -e "\n" + echo log_echo "${Error} ${RedBG} $(gettext "不支持的文件扩展名") $fm_EXTENSION ${Font}" ;; esac } -# 主菜单循环 fm_main_menu() { fm_list_files while true; do @@ -225,7 +204,7 @@ fm_main_menu() { 4) fm_delete_file ;; 5) source "$idleleo" ;; *) - echo -e "\n" + echo log_echo "${Error} ${RedBG} $(gettext "无效选项, 请重试") ${Font}" ;; esac @@ -236,7 +215,6 @@ fm_check_for_updates() { local latest_version local update_choice - # 直接使用 curl 下载远程版本信息 latest_version=$(curl -s "$fm_remote_url" | grep 'fm_SCRIPT_VERSION=' | head -n 1 | sed 's/fm_SCRIPT_VERSION="//; s/"//') if [ -n "$latest_version" ] && [ "$latest_version" != "$fm_SCRIPT_VERSION" ]; then log_echo "${Warning} ${YellowBG} $(gettext "新版本可用"): $latest_version $(gettext "当前版本"): $fm_SCRIPT_VERSION ${Font}" @@ -251,10 +229,10 @@ fm_check_for_updates() { if [ $? -eq 0 ]; then chmod +x "${idleleo_dir}/file_manager.sh" - log_echo "${OK} ${Green} $(gettext "下载完成, 正在重新运行脚本")... ${Font}" - bash "${idleleo}" --add-servernames + log_echo "${OK} ${GreenBG} $(gettext "下载完成, 请重新运行脚本") ${Font}" + bash "${idleleo}" else - echo -e "\n" + echo log_echo "${Error} ${RedBG} $(gettext "下载失败, 请手动下载并安装新版本") ${Font}" fi ;; @@ -271,21 +249,17 @@ fm_restart_nginx_and_check_status() { if [[ -f ${nginx_systemd_file} ]]; then systemctl restart nginx if systemctl is-active --quiet nginx; then - echo -e "\n" + echo log_echo "${OK} ${GreenBG} Nginx $(gettext "重启成功") ${Font}" else - echo -e "\n" + echo log_echo "${Error} ${RedBG} Nginx $(gettext "重启失败"), $(gettext "请检查配置文件是否有误") ${Font}" fm_edit_file fi fi } -# 检查更新 fm_check_for_updates - -# 运行主菜单 fm_main_menu -# 恢复原始工作目录 cd "$fm_original_dir" || exit 1 \ No newline at end of file diff --git a/install.sh b/install.sh index 39ac434..f13b685 100644 --- a/install.sh +++ b/install.sh @@ -433,7 +433,7 @@ create_directory() { port_set() { if [[ "on" != ${old_config_status} ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "确定 连接端口") ${Font}" read_optimize "$(gettext "请输入连接端口") ($(gettext "默认值"):443):" "port" 443 0 65535 "$(gettext "请输入 0-65535 之间的值")!" if [[ ${port} -eq 9443 ]] && [[ ${tls_mode} == "Reality" ]]; then @@ -445,7 +445,7 @@ port_set() { ws_grpc_choose() { if [[ "on" != ${old_config_status} ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "请选择安装协议") ws/gRPC ${Font}" echo -e "${Red}1${Font}: ws ($(gettext "默认"))" echo "2: gRPC" @@ -471,7 +471,7 @@ ws_grpc_choose() { xray_reality_add_more_choose() { if [[ "on" != ${old_config_status} ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否添加简单 ws/gRPC 协议 用于负载均衡") [Y/${Red}N${Font}${GreenBG}]? ${Font}" echo -e "${Warning} ${YellowBG} $(gettext "如不清楚具体用途, 请勿选择")! ${Font}" read -r reality_add_more_fq @@ -520,7 +520,7 @@ ws_grpc_qr() { ws_inbound_port_set() { if [[ "on" != ${old_config_status} ]]; then if [[ ${ws_grpc_mode} == "onlyws" ]] || [[ ${ws_grpc_mode} == "all" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要自定义") ws inbound_port [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r inbound_port_modify_fq case $inbound_port_modify_fq in @@ -542,7 +542,7 @@ ws_inbound_port_set() { grpc_inbound_port_set() { if [[ "on" != ${old_config_status} ]]; then if [[ ${ws_grpc_mode} == "onlygRPC" ]] || [[ ${ws_grpc_mode} == "all" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要自定义") gRPC inbound_port [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r inbound_port_modify_fq case $inbound_port_modify_fq in @@ -563,7 +563,7 @@ grpc_inbound_port_set() { } firewall_set() { - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要设置防火墙") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r firewall_set_fq case $firewall_set_fq in @@ -623,7 +623,7 @@ firewall_set() { ws_path_set() { if [[ "on" != ${old_config_status} ]] || [[ ${change_ws_path} == "yes" ]]; then if [[ ${ws_grpc_mode} == "onlyws" ]] || [[ ${ws_grpc_mode} == "all" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要自定义") ws $(gettext "伪装路径") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r path_modify_fq case $path_modify_fq in @@ -640,7 +640,7 @@ ws_path_set() { path="$(head -n 10 /dev/urandom | md5sum | head -c ${random_num})" fi elif [[ ${ws_grpc_mode} == "onlyws" ]] || [[ ${ws_grpc_mode} == "all" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要修改") ws $(gettext "伪装路径") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r change_ws_path_fq case $change_ws_path_fq in @@ -656,7 +656,7 @@ ws_path_set() { grpc_path_set() { if [[ "on" != ${old_config_status} ]] || [[ ${change_grpc_path} == "yes" ]]; then if [[ ${ws_grpc_mode} == "onlygRPC" ]] || [[ ${ws_grpc_mode} == "all" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要自定义") gRPC $(gettext "伪装路径") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r path_modify_fq case $path_modify_fq in @@ -673,7 +673,7 @@ grpc_path_set() { serviceName="$(head -n 10 /dev/urandom | md5sum | head -c ${random_num})" fi elif [[ ${ws_grpc_mode} == "onlygRPC" ]] || [[ ${ws_grpc_mode} == "all" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要修改") gRPC $(gettext "伪装路径") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r change_grpc_path_fq case $change_grpc_path_fq in @@ -688,7 +688,7 @@ grpc_path_set() { email_set() { if [[ "on" != ${old_config_status} ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要自定义") Xray $(gettext "用户名") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r custom_email_fq case $custom_email_fq in @@ -705,7 +705,7 @@ email_set() { UUID_set() { if [[ "on" != ${old_config_status} ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要自定义字符串映射") (UUIDv5) [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r need_UUID5 case $need_UUID5 in @@ -714,14 +714,14 @@ UUID_set() { UUID="$(UUIDv5_tranc ${UUID5_char})" log_echo "${Green} $(gettext "自定义字符串"): ${UUID5_char} ${Font}" log_echo "${Green} UUIDv5: ${UUID} ${Font}" - echo -e "\n" + echo ;; *) UUID5_char="$(head -n 10 /dev/urandom | md5sum | head -c ${random_num})" UUID="$(UUIDv5_tranc ${UUID5_char})" log_echo "${Green} UUID $(gettext "映射字符串"): ${UUID5_char} ${Font}" log_echo "${Green} UUID: ${UUID} ${Font}" - echo -e "\n" + echo ;; esac fi @@ -729,7 +729,7 @@ UUID_set() { target_set() { if [[ "on" == ${old_config_status} ]] && [[ $(info_extraction target) != null ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "检测到 target 域名已配置, 是否保留") [${Red}Y${Font}${GreenBG}/N]? ${Font}" read -r old_host_fq case $old_host_fq in @@ -749,7 +749,7 @@ target_set() { pkg_install "nmap" while true; do - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "请输入一个域名") (e.g. bing.com)${Font}" log_echo "${Green}$(gettext "域名要求支持 TLSv1.3、X25519 与 H2 以及域名非跳转用")${Font}" read_optimize "$(gettext "确认域名符合要求后请输入"): " "domain" "NULL" @@ -807,7 +807,7 @@ target_set() { serverNames_set() { if [[ ${target_reset} == 1 ]] || [[ "on" != ${old_config_status} ]]; then local custom_serverNames_fq - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要修改") ${target} $(gettext "域名的") serverNames [Y/${Red}N${Font}${GreenBG}]? ${Font}" echo -e "${Green} $(gettext "默认为") ${target} $(gettext "域名本身")${Font}" echo -e "${Warning} ${YellowBG} $(gettext "如不清楚具体用途, 请勿继续")! ${Font}" @@ -821,7 +821,7 @@ serverNames_set() { ;; esac log_echo "${Green} serverNames: ${serverNames} ${Font}" - echo -e "\n" + echo fi } @@ -846,7 +846,7 @@ shortIds_set() { nginx_upstream_server_set() { if [[ ${tls_mode} == "TLS" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否变更") Nginx $(gettext "负载均衡") [Y/${Red}N${Font}${GreenBG}]? ${Font}" echo -e "${Warning} ${YellowBG} $(gettext "如不清楚具体用途, 请勿继续")! ${Font}" read -r nginx_upstream_server_fq @@ -889,7 +889,7 @@ nginx_upstream_server_set() { nginx_servernames_server_set() { if [[ ${tls_mode} == "Reality" ]] && [[ ${reality_add_nginx} == "on" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否变更") Nginx serverNames [Y/${Red}N${Font}${GreenBG}]? ${Font}" echo -e "${Warning} ${YellowBG} $(gettext "如不清楚具体用途, 请勿继续")! ${Font}" echo -e "${Info} ${GreenBG} $(gettext "配置用途可以参考文章"): ($(gettext "敬请期待")) ${Font}" @@ -1052,7 +1052,7 @@ modify_email_address() { sed -i "s/^\( *\)\"email\".*/\1\"email\": \"${custom_email}\"/g" ${xray_conf} judge "Xray $(gettext "用户名修改")" else - echo -e "\n" + echo log_echo "${Warning} ${YellowBG} $(gettext "请先删除多余的用户") ${Font}" fi } @@ -1062,7 +1062,7 @@ modify_UUID() { sed -i "s/^\( *\)\"id\".*/\1\"id\": \"${UUID}\",/g" ${xray_conf} judge "Xray UUID $(gettext "修改")" else - echo -e "\n" + echo log_echo "${Warning} ${YellowBG} $(gettext "请先删除多余的用户") ${Font}" fi } @@ -1180,7 +1180,7 @@ xray_update() { } reality_nginx_add_fq() { - echo -e "\n" + echo log_echo "${Warning} ${Green} $(gettext "Reality 协议有流量偷跑的风险") ${Font}" log_echo "${Warning} ${Green} $(gettext "该风险在 target 网址被 cdn 加速时存在") ${Font}" log_echo "${GreenBG} $(gettext "是否额外安装 nginx 前置保护(推荐)") [${Red}Y${Font}${GreenBG}/N]? ${Font}" @@ -1328,7 +1328,7 @@ nginx_update() { timeout "$(gettext "删除旧版") Nginx !" rm -rf ${nginx_dir} if [[ ${auto_update} != "YES" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否保留原 Nginx 配置文件") [${Red}Y${Font}${GreenBG}/N]? ${Font}" read -r save_originconf_fq else @@ -1355,7 +1355,7 @@ nginx_update() { if ! service_start; then log_echo "${Error} ${RedBG} Nginx $(gettext "启动失败")! ${Font}" if [[ ${auto_update} != "YES" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否回滚到之前的版本") [${Red}Y${Font}${GreenBG}/N]? ${Font}" read -r rollback_fq else @@ -1405,7 +1405,7 @@ auto_update() { crontab_file="/var/spool/cron/crontabs/root" fi if [[ ! -f "${auto_update_file}" ]] || [[ $(crontab -l | grep -c "auto_update.sh") -lt 1 ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "设置后台定时自动更新程序 (包含: 脚本/Xray/Nginx)") ${Font}" log_echo "${GreenBG} $(gettext "可能自动更新后有兼容问题, 谨慎开启") ${Font}" log_echo "${GreenBG} $(gettext "是否开启") [Y/${Red}N${Font}${GreenBG}]? ${Font}" @@ -1442,7 +1442,7 @@ ssl_install() { domain_check() { if [[ "on" == ${old_config_status} ]] && [[ $(info_extraction host) != null ]] && [[ $(info_extraction ip_version) != null ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "检测到原域名配置存在, 是否跳过域名设置") [${Red}Y${Font}${GreenBG}/N]? ${Font}" read -r old_host_fq case $old_host_fq in @@ -1466,7 +1466,7 @@ domain_check() { ;; esac fi - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "确定域名信息") ${Font}" read_optimize "$(gettext "请输入你的域名信息") (e.g. www.idleleo.com):" "domain" "NULL" echo -e "\n${GreenBG} $(gettext "请选择公网IP(IPv4/IPv6)或手动输入域名") ${Font}" @@ -1528,7 +1528,7 @@ domain_check() { ip_check() { if [[ "on" == ${old_config_status} || ${auto_update} == "YES" ]] && [[ $(info_extraction host) != null ]] && [[ $(info_extraction ip_version) != null ]]; then if [[ ${auto_update} != "YES" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "检测到原IP配置存在, 是否跳过IP设置") [${Red}Y${Font}${GreenBG}/N]? ${Font}" read -r old_host_fq else @@ -1549,13 +1549,13 @@ ip_check() { log_echo "${Error} ${RedBG} $(gettext "无法获取公网IP地址"), $(gettext "安装终止")! ${Font}" return 1 fi - echo -e "\n" + echo log_echo "${OK} ${GreenBG} $(gettext "已跳过IP设置") ${Font}" return 0 ;; esac fi - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "确定公网IP信息") ${Font}" log_echo "${GreenBG} $(gettext "请选择公网IP为IPv4或IPv6") ${Font}" echo -e "${Red}1${Font}: IPv4 ($(gettext "默认"))" @@ -1649,7 +1649,7 @@ xray_conf_add() { modify_email_address modify_UUID else - echo -e "\n" + echo log_echo "${Warning} ${GreenBG} $(gettext "检测到 Xray 配置过多用户") ${Font}" log_echo "${GreenBG} $(gettext "是否保留原 Xray 配置文件") [${Red}Y${Font}${GreenBG}/N]? ${Font}" read -r save_originxray_fq @@ -1683,7 +1683,7 @@ xray_reality_add_more() { old_config_exist_check() { if [[ -f "${xray_qr_config_file}" ]]; then if [[ ${old_tls_mode} == ${tls_mode} ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "检测到配置文件, 是否读取配置文件") [${Red}Y${Font}${GreenBG}/N]? ${Font}" read -r old_config_fq case $old_config_fq in @@ -1698,7 +1698,7 @@ old_config_exist_check() { ;; esac else - echo -e "\n" + echo log_echo "${Warning} ${GreenBG} $(gettext "检测到当前安装模式与配置文件的安装模式不一致") ${Font}" log_echo "${GreenBG} $(gettext "是否保留配置文件 (强烈不建议)") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r old_config_fq @@ -1795,7 +1795,7 @@ old_config_input() { fi fi if [[ 0 -eq ${read_config_status} ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "检测到配置文件不完整, 是否保留配置文件") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r old_config_input_fq case $old_config_input_fq in @@ -2027,7 +2027,7 @@ acme_cron_update() { crontab_file="/var/spool/cron/crontabs/root" fi if [[ -f "${ssl_update_file}" ]] && [[ $(crontab -l | grep -c "ssl_update.sh") == "1" ]]; then - echo -e "\n" + echo log_echo "${Warning} ${GreenBG} $(gettext "新版本已自动设置证书自动更新") ${Font}" log_echo "${Warning} ${GreenBG} $(gettext "老版本请及时删除 废弃的 改版证书自动更新")! ${Font}" log_echo "${GreenBG} $(gettext "已设置改版证书自动更新") ${Font}" @@ -2043,7 +2043,7 @@ acme_cron_update() { esac else - echo -e "\n" + echo log_echo "${OK} ${GreenBG} $(gettext "新版本已自动设置证书自动更新") ${Font}" fi else @@ -2063,13 +2063,13 @@ check_cert_status() { ((remainingDays = 90 - days)) tlsStatus=${remainingDays} [[ ${remainingDays} -le 0 ]] && tlsStatus="${Red}$(gettext "已过期")${Font}" - echo -e "\n" + echo log_echo "${Green}$(gettext "证书生成日期"): $(date -d "@${modifyTime}" +"%F %H:%M:%S")${Font}" log_echo "${Green}$(gettext "证书生成天数"): ${days}${Font}" log_echo "${Green}$(gettext "证书剩余天数"): ${tlsStatus}${Font}" - echo -e "\n" + echo if [[ ${remainingDays} -le 0 ]]; then - echo -e "\n" + echo log_echo "${Warning} ${YellowBG} $(gettext "是否立即更新证书") [Y/${Red}N${Font}${YellowBG}]? ${Font}" read -r cert_update_manuel_fq case $cert_update_manuel_fq in @@ -2121,7 +2121,7 @@ set_fail2ban() { clean_logs() { local cron_file logrotate_config - echo -e "\n" + echo log_echo "${Green} $(gettext "检测到日志文件大小如下:") ${Font}" log_echo "${Green}$(du -sh /var/log/xray ${nginx_dir}/logs)${Font}" timeout "$(gettext "即将清除")!" @@ -2152,7 +2152,7 @@ clean_logs() { fi #兼容代码结束 - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否需要设置自动清理日志") [${Red}Y${Font}${GreenBG}/N]? ${Font}" read -r auto_clean_logs_fq case $auto_clean_logs_fq in @@ -2314,39 +2314,39 @@ vless_qr_link_image() { fi fi { - echo -e "\n" + echo log_echo "${Red} —————————————— Xray $(gettext "配置分享") —————————————— ${Font}" if [[ ${tls_mode} == "Reality" ]]; then log_echo "${Red} URL $(gettext "分享链接"):${Font} ${vless_link}" log_echo "${Red} $(gettext "二维码"): ${Font}" echo -n "${vless_link}" | qrencode -o - -t utf8 - echo -e "\n" + echo fi if [[ ${ws_grpc_mode} == "onlyws" ]]; then log_echo "${Red} ws URL $(gettext "分享链接"):${Font} ${vless_ws_link}" log_echo "${Red} $(gettext "二维码"): ${Font}" echo -n "${vless_ws_link}" | qrencode -o - -t utf8 - echo -e "\n" + echo elif [[ ${ws_grpc_mode} == "onlygRPC" ]]; then log_echo "${Red} gRPC URL $(gettext "分享链接"):${Font} ${vless_grpc_link}" log_echo "${Red} $(gettext "二维码"): ${Font}" echo -n "${vless_grpc_link}" | qrencode -o - -t utf8 - echo -e "\n" + echo elif [[ ${ws_grpc_mode} == "all" ]]; then log_echo "${Red} ws URL $(gettext "分享链接"):${Font} ${vless_ws_link}" log_echo "${Red} $(gettext "二维码"): ${Font}" echo -n "${vless_ws_link}" | qrencode -o - -t utf8 - echo -e "\n" + echo log_echo "${Red} gRPC URL $(gettext "分享链接"):${Font} ${vless_grpc_link}" log_echo "${Red} $(gettext "二维码"): ${Font}" echo -n "${vless_grpc_link}" | qrencode -o - -t utf8 - echo -e "\n" + echo fi } >>"${xray_info_file}" } vless_link_image_choice() { - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "生成分享链接"): ${Font}" vless_qr_link_image } @@ -2358,7 +2358,7 @@ info_extraction() { basic_information() { { - echo -e "\n" + echo case ${shell_mode} in Nginx+ws+TLS) log_echo "${OK} ${GreenBG} Xray+Nginx+ws+TLS $(gettext "安装成功") ${Font}" @@ -2391,9 +2391,9 @@ basic_information() { log_echo "${OK} ${GreenBG} ws+gRPC ONLY $(gettext "安装成功") ${Font}" ;; esac - echo -e "\n" + echo log_echo "${Warning} ${YellowBG} VLESS $(gettext "目前分享链接规范为实验阶段, 请自行判断是否适用") ${Font}" - echo -e "\n" + echo log_echo "${Red} —————————————— Xray $(gettext "配置信息") —————————————— ${Font}" log_echo "${Red} $(gettext "主机") (host):${Font} $(info_extraction host) " if [[ ${tls_mode} == "None" ]]; then @@ -2464,7 +2464,7 @@ show_information() { ssl_judge_and_install() { cd $HOME - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "即将申请证书, 支持使用自定义证书") ${Font}" log_echo "${Green} $(gettext "如需使用自定义证书, 请按如下步骤:") ${Font}" log_echo " $(gettext "1. 将证书文件重命名: 私钥(xray.key)、证书(xray.crt)")" @@ -2558,7 +2558,7 @@ EOF tls_type() { if [[ -f "${nginx_conf}" ]] && [[ ${tls_mode} == "TLS" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "请选择支持的 TLS 版本") (default:2): ${Font}" log_echo "${GreenBG} $(gettext "建议选择 TLS1.3 only (安全模式)") ${Font}" echo -e "1: TLS1.2 and TLS1.3 ($(gettext "兼容模式"))" @@ -2697,7 +2697,7 @@ reset_target() { show_user() { if [[ -f "${xray_qr_config_file}" ]] && [[ -f "${xray_conf}" ]] && [[ ${tls_mode} != "None" ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "即将显示用户, 一次仅能显示一个") ${Font}" if [[ ${tls_mode} == "TLS" ]]; then log_echo "${GreenBG} $(gettext "请选择显示用户使用的协议") ws/gRPC ${Font}" @@ -2709,7 +2709,7 @@ show_user() { elif [[ ${tls_mode} == "Reality" ]]; then choose_user_prot=0 fi - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "请选择要显示的用户编号"): ${Font}" jq -r -c .inbounds[${choose_user_prot}].settings.clients[].email ${xray_conf} | awk '{print NR""": "$0}' local show_user_index @@ -2748,7 +2748,7 @@ show_user() { log_echo "${Red} URL $(gettext "分享链接"):${Font} ${user_vless_link}" echo -n "${user_vless_link}" | qrencode -o - -t utf8 fi - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否继续显示用户") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r show_user_continue case $show_user_continue in @@ -2768,7 +2768,7 @@ add_user() { local choose_user_prot reality_user_more if [[ -f "${xray_qr_config_file}" ]] && [[ -f "${xray_conf}" ]] && [[ ${tls_mode} != "None" ]]; then service_stop - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "即将添加用户, 一次仅能添加一个") ${Font}" if [[ ${tls_mode} == "TLS" ]]; then log_echo "${GreenBG} $(gettext "请选择添加用户使用的协议") ws/gRPC ${Font}" @@ -2797,7 +2797,7 @@ add_user() { mv "${xray_conf}.tmp" "${xray_conf}" jq ". += {\"multi_user\": \"yes\"}" ${xray_qr_config_file} > "${xray_qr_config_file}.tmp" mv "${xray_qr_config_file}.tmp" "${xray_qr_config_file}" - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否继续添加用户") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r add_user_continue case $add_user_continue in @@ -2817,7 +2817,7 @@ add_user() { remove_user() { if [[ -f "${xray_qr_config_file}" ]] && [[ -f "${xray_conf}" ]] && [[ ${tls_mode} != "None" ]]; then service_stop - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "即将删除用户, 一次仅能删除一个") ${Font}" if [[ ${tls_mode} == "TLS" ]]; then log_echo "${GreenBG} $(gettext "请选择删除用户使用的协议") ws/gRPC ${Font}" @@ -2829,7 +2829,7 @@ remove_user() { elif [[ ${tls_mode} == "Reality" ]]; then choose_user_prot=0 fi - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "请选择要删除的用户编号") ${Font}" jq -r -c .inbounds[${choose_user_prot}].settings.clients[].email ${xray_conf} | awk '{print NR""": "$0}' local del_user_index @@ -2838,7 +2838,7 @@ remove_user() { log_echo "${Error} ${RedBG} $(gettext "选择错误") ! ${Font}" remove_user elif [[ ${del_user_index} == 1 ]]; then - echo -e "\n" + echo log_echo "${Error} ${RedBG} $(gettext "请直接在主菜单修改主用户的") UUID/Email ! ${Font}" timeout "$(gettext "回到菜单") !" menu @@ -2848,7 +2848,7 @@ remove_user() { 'del(.inbounds[$choose_user_prot].settings.clients[$del_user_index])' ${xray_conf} > "${xray_conf}.tmp" judge "$(gettext "删除用户")" mv "${xray_conf}.tmp" "${xray_conf}" - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "是否继续删除用户") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r remove_user_continue case $remove_user_continue in @@ -2884,7 +2884,7 @@ show_error_log() { xray_status_add() { if [[ -f "${xray_conf}" ]]; then if [[ $(jq -r .stats ${xray_conf}) != null ]]; then - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "已配置 Xray 流量统计") ${Font}" log_echo "${GreenBG} $(gettext "是否需要关闭此功能") [Y/${Red}N${Font}${GreenBG}]? ${Font}" read -r xray_status_add_fq @@ -2900,7 +2900,7 @@ xray_status_add() { *) ;; esac else - echo -e "\n" + echo log_echo "${GreenBG} Xray $(gettext "流量统计需要使用") api ${Font}" log_echo "${GreenBG} $(gettext "可能会影响 Xray 性能") ${Font}" log_echo "${GreenBG} $(gettext "是否继续") [Y/${Red}N${Font}${GreenBG}]? ${Font}" @@ -3198,10 +3198,10 @@ update_sh() { if [[ ${shell_version} != ${newest_version} ]]; then if [[ ${auto_update} != "YES" ]]; then if [[ ${version_difference} == 1 ]]; then - echo -e "\n" + echo log_echo "${Warning} ${YellowBG} $(gettext "存在新版本, 但版本变化较大, 可能存在不兼容情况, 是否更新") [Y/${Red}N${Font}${YellowBG}]? ${Font}" else - echo -e "\n" + echo log_echo "${GreenBG} $(gettext "存在新版本, 是否更新") [Y/${Red}N${Font}${GreenBG}]? ${Font}" fi read -r update_confirm @@ -3268,7 +3268,7 @@ list() { install_xray_reality ;; '-3' | '--install-none') - echo -e "\n" + echo log_echo "${Warning} ${YellowBG} $(gettext "此模式推荐用于负载均衡, 一般情况不推荐使用, 是否安装") [Y/${Red}N${Font}${YellowBG}]? ${Font}" read -r wsonly_fq case $wsonly_fq in @@ -3412,7 +3412,7 @@ idleleo_commend() { judge "$(gettext "下载最新脚本")" clear log_echo "${Warning} ${YellowBG} $(gettext "脚本版本变化较大, 若服务无法正常运行请卸载后重装") ! ${Font}" - echo -e "\n" + echo ;; *) source "$idleleo" @@ -3517,7 +3517,7 @@ check_online_version_connect() { } set_language() { - echo -e "\n" + echo log_echo "${GreenBG} 选择语言 / Select Language / انتخاب زبان / Выберите язык ${Font}" echo -e "${Green}1.${Font} 中文" echo -e "${Green}2.${Font} English" @@ -3638,7 +3638,7 @@ function restore_directories() { fix_bugs() { local log_cleanup_file_path="/etc/logrotate.d/custom_log_cleanup" if [[ -f "${log_cleanup_file_path}" ]]; then - echo -e "\n" + echo log_echo "${Warning} ${RedBG} $(gettext "检测存在到") BUG ! ${Font}" log_echo "${Warning} ${YellowBG} BUG $(gettext "来源于自动清理日志错误的设置") ${Font}" log_echo "${Warning} ${YellowBG} $(gettext "开始修复")... ${Font}" @@ -3653,15 +3653,15 @@ fix_bugs() { #兼容代码结束 menu() { - echo -e "\n" + echo log_echo "Xray $(gettext "安装管理脚本") ${Red}[${shell_version}]${Font} ${shell_emoji}" log_echo "--- $(gettext "作者"): hello-yunshu ---" log_echo "--- $(gettext "修改"): hey.run ---" log_echo "--- https://github.com/hello-yunshu ---" - echo -e "\n" + echo log_echo "$(gettext "当前模式"): ${shell_mode}" log_echo "$(gettext "当前语言"): ${LANG%.*}" - echo -e "\n" + echo echo -e "$(gettext "可以使用")${RedW} idleleo ${Font}$(gettext "命令管理脚本")${Font}\n" @@ -3740,7 +3740,7 @@ menu() { source "$idleleo" ;; 2) - echo -e "\n" + echo log_echo "${Red}[$(gettext "不建议")]${Font} $(gettext "频繁升级 Nginx, 请确认 Nginx 有升级的必要")!" timeout "$(gettext "开始升级")!" nginx_update @@ -3761,7 +3761,7 @@ menu() { source "$idleleo" ;; 5) - echo -e "\n" + echo log_echo "${Warning} ${YellowBG} $(gettext "此模式推荐用于负载均衡, 一般情况不推荐使用, 是否安装") [Y/${Red}N${Font}${YellowBG}]? ${Font}" read -r wsonly_fq case $wsonly_fq in