diff --git a/scripts/lang/chs/2_settings.lang b/scripts/lang/chs/2_settings.lang index f269d4f6..a29a3ee8 100644 --- a/scripts/lang/chs/2_settings.lang +++ b/scripts/lang/chs/2_settings.lang @@ -1,7 +1,7 @@ # ================================================= # Settings main menu # ================================================= -SET_MENU_TITLE="欢迎使用功能设置菜单:" +SET_MENU_TITLE="功能设置菜单" SET_MENU_REDIR="路由模式设置:" SET_MENU_DNS="DNS设置: " SET_MENU_FW_FILTER="透明路由流量过滤" @@ -17,14 +17,14 @@ SET_MENU_UI="UI切换" # Main menu messages # ================================================= SET_WARN_NONROOT="非root用户可能无法正确配置其他模式,是否继续?" -SET_SKIP_CERT_ON="已开启跳过本地证书验证!" -SET_SKIP_CERT_OFF="已关闭跳过本地证书验证!" +SET_SKIP_CERT_ON="已启用跳过本地证书验证!" +SET_SKIP_CERT_OFF="已禁用跳过本地证书验证!" SET_SNIFFER_CORE_SWITCH="已自动切换至Meta内核(域名嗅探需要)" SET_SNIFFER_LOCKED="当前内核与DNS模式组合下,域名嗅探无法关闭!" SET_CORE_RUNNING="检测到服务正在运行,需要先停止服务!" -SET_CORE_STOP_CONFIRM="是否停止服务?" +SET_CORE_STOP_CONFIRM="是否确认停止服务:" # ================================================= # Backup / Restore / Reset @@ -33,9 +33,11 @@ SET_BACKUP="备份脚本设置" SET_RESTORE="还原脚本设置" SET_RESET="重置脚本设置" -SET_BACKUP_OK="脚本设置已备份!" +SET_BACKUP_OK="备份脚本设置成功!" +SET_BACKUP_FAIL="备份脚本设置失败!" SET_RESTORE_OK="脚本设置已还原!(被覆盖配置已备份)" -SET_RESET_OK="脚本设置已重置!(旧配置已备份)" +SET_RESET_OK="重置脚本设置成功!(旧配置已备份)" +SET_RESET_FAIL="重置脚本设置失败!" SET_BACKUP_MISS="未找到备份文件,请先备份!" SET_NEED_RESTART="请重新启动脚本以生效!" @@ -45,7 +47,7 @@ SET_NEED_RESTART="请重新启动脚本以生效!" SET_REDIR_DEFAULT="Redir模式" SET_REDIR_CURRENT="当前路由模式为:" SET_CORE_CURRENT="ShellCrash 核心为:" -SET_REDIR_RESTART_HINT="切换模式后需要手动重启服务以生效!" +SET_REDIR_RESTART_HINT="注意:切换模式后需要手动重启服务以生效!" SET_REDIR_APPLIED="已设为" @@ -57,7 +59,7 @@ SET_REDIR_TUN="Tun模式" SET_REDIR_REDIRDES="Redir转发TCP,不转发UDP" SET_REDIR_MIXDES="Redir转发TCP,Tun转发UDP" SET_REDIR_TPROXYDES="Tproxy转发TCP&UDP" -SET_REDIR_TUNDES="Tun转发TCP&UDP(占用高不推荐)" +SET_REDIR_TUNDES="Tun转发TCP&UDP(占用高不推荐)" SET_NO_MOD="设备未检测到内核模块:" SET_NO_MOD2="请尝试其他模式或者安装相关依赖!" @@ -72,7 +74,8 @@ SET_FW_SWITCH="切换防火墙应用" SET_FW_AREA_DESC="仅局域网|仅本机|局域网+本机|纯净模式|旁路转发" -FW_AREA_NOTE="如你使用了第三方DNS如smartdns等,请勿启用本机劫持或使用shellcrash用户执行!" +FW_AREA_NOTE_1="如你使用了第三方DNS如smartdns等," +FW_AREA_NOTE_2="请勿启用本机劫持或使用shellcrash用户执行!" FW_AREA_LAN="仅劫持局域网流量" FW_AREA_LOCAL="仅劫持本机流量" FW_AREA_BOTH="劫持局域网 + 本机流量" @@ -88,7 +91,8 @@ VM_DISABLE="禁用劫持" VM_INPUT_INFO="多个网段请用空格连接,可使用【ip route】命令查看,例如:" VM_INPUT_NET="请输入自定义网段" VM_NO_NET_DETECTED="未检测到容器或虚拟机网段,请先运行容器后再运行脚本,或选择手动设置网段!" -VM_INPUT_DESC="多个网段请使用空格分隔,可通过【ip route】命令查看,例如:" +VM_INPUT_DESC_1="多个网段请使用空格分隔,可通过【ip route】命令查看" +VM_INPUT_DESC_2="例如:" #inputport INPUT_PORT="请输入端口号" @@ -119,7 +123,7 @@ ADV_HOST_INPUT="请输入自定义 Host 地址(输入 0 移除)" ADV_HOST_REMOVED="自定义 Host 地址已移除,请重新运行脚本以自动获取!" ADV_HOST_INVALID="输入错误,请仔细核对!" # Routing table -ADV_TABLE_WARN="仅当 Tproxy / Tun / 混合模式下路由表发生冲突时才需要设置!" +ADV_TABLE_WARN="仅当 Tproxy/Tun/混合模式 下路由表发生冲突时才需要设置!" ADV_TABLE_INPUT="请输入路由表编号(不清楚请勿修改,建议 102-125)" # ================================================= diff --git a/scripts/lang/chs/common.lang b/scripts/lang/chs/common.lang index 7aadbafb..0a553b51 100644 --- a/scripts/lang/chs/common.lang +++ b/scripts/lang/chs/common.lang @@ -1,8 +1,7 @@ -COMMON_INPUT="请输入对应数字" +COMMON_INPUT="请输入对应标号" COMMON_BACK="返回上级菜单" COMMON_SUCCESS="设置成功!" COMMON_FAILED="设置失败!" COMMON_UNSET="未设置" COMMON_MOD="模式" - diff --git a/scripts/menus/2_settings.sh b/scripts/menus/2_settings.sh index deaef0ec..37bbdb19 100644 --- a/scripts/menus/2_settings.sh +++ b/scripts/menus/2_settings.sh @@ -14,81 +14,154 @@ settings() { [ -z "$sniffer" ] && sniffer=OFF [ -z "$dns_mod" ] && dns_mod='redir_host' - echo "-----------------------------------------------" - echo -e "\033[30;47m$SET_MENU_TITLE\033[0m" - echo "-----------------------------------------------" - echo -e " 1 $SET_MENU_REDIR\t\033[36m$redir_mod$MENU_MOD\033[0m" - echo -e " 2 $SET_MENU_DNS\t\033[36m$dns_mod\033[0m" - echo -e " 3 $SET_MENU_FW_FILTER" + line_break + separator_line "=" + content_line "\033[30;47m$SET_MENU_TITLE\033[0m" + separator_line "-" + content_line "1) $SET_MENU_REDIR\t\033[36m$redir_mod$MENU_MOD\033[0m" + content_line "2) $SET_MENU_DNS\t\033[36m$dns_mod\033[0m" + content_line "3) $SET_MENU_FW_FILTER" [ "$disoverride" != "1" ] && { - echo -e " 4 $SET_MENU_SKIP_CERT\t\033[36m$skip_cert\033[0m" - echo -e " 5 $SET_MENU_SNIFFER\t\033[36m$sniffer\033[0m" - echo -e " 6 $SET_MENU_ADV_PORT" + content_line "4) $SET_MENU_SKIP_CERT\t\033[36m$skip_cert\033[0m" + content_line "5) $SET_MENU_SNIFFER\t\033[36m$sniffer\033[0m" + content_line "6) $SET_MENU_ADV_PORT" } - echo -e " 8 $SET_MENU_IPV6\t\033[36m$ipv6_redir\033[0m" - echo "-----------------------------------------------" - echo -e " a \033[31m$SET_MENU_RESET\033[0m" - echo -e " b \033[36m$SET_MENU_LANG\033[0m" - echo -e " c \033[33m$SET_MENU_UI\033[0m" - echo -e " 0 $COMMON_BACK" - echo "-----------------------------------------------" - read -p "$COMMON_INPUT > " num - + content_line "8) $SET_MENU_IPV6\t\033[36m$ipv6_redir\033[0m" + content_line "" + content_line "a) \033[31m$SET_MENU_RESET\033[0m" + content_line "b) \033[36m$SET_MENU_LANG\033[0m" + content_line "c) \033[33m$SET_MENU_UI\033[0m" + content_line "" + content_line "0) $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num case "$num" in "" | 0) break ;; 1) - if [ "$USER" != root -a "$USER" != admin ]; then - echo "-----------------------------------------------" - read -p "$SET_WARN_NONROOT (1/0) > " res - [ "$res" = 1 ] && set_redir_mod + if [ "$USER" != root ] && [ "$USER" != admin ]; then + line_break + separator_line "=" + content_line "$SET_WARN_NONROOT" + separator_line "-" + content_line "1) 是" + content_line "0) 否,返回上级菜单" + separator_line "=" + read -r -p "$COMMON_INPUT> " res + if [ "$res" = 1 ]; then + set_redir_mod + else + continue + fi else set_redir_mod fi ;; 2) . "$CRASHDIR"/menus/dns.sh && set_dns_mod - sleep 1 ;; 3) . "$CRASHDIR"/menus/fw_filter.sh && set_fw_filter - sleep 1 ;; 4) - echo "-----------------------------------------------" - if [ "$skip_cert" = OFF ]; then - skip_cert=ON - echo -e "\033[33m$SET_SKIP_CERT_ON\033[0m" + line_break + separator_line "=" + if [ "$skip_cert" = "OFF" ]; then + content_line "当前\033[33m已禁用\033[0m跳过本地证书验证,是否确认启用:" else - skip_cert=OFF - echo -e "\033[33m$SET_SKIP_CERT_OFF\033[0m" + content_line "当前\033[33m已启用\033[0m跳过本地证书验证,是否确认禁用:" fi - setconfig skip_cert $skip_cert + separator_line "-" + content_line "1) 是" + content_line "0) 否,返回上级菜单" + separator_line "=" + read -r -p "$COMMON_INPUT> " num + + if [ "$num" = 1 ]; then + line_break + separator_line "=" + if [ "$skip_cert" = OFF ]; then + skip_cert=ON + content_line "\033[33m$SET_SKIP_CERT_ON\033[0m" + else + skip_cert=OFF + content_line "\033[33m$SET_SKIP_CERT_OFF\033[0m" + fi + setconfig skip_cert $skip_cert + separator_line "=" + else + continue + fi + sleep 1 ;; 5) - echo "-----------------------------------------------" - if [ "$sniffer" = OFF ]; then - if [ "$crashcore" = clash ]; then - rm -rf "$TMPDIR/CrashCore" "$CRASHDIR/CrashCore" "$CRASHDIR/CrashCore.tar.gz" - crashcore=meta - setconfig crashcore $crashcore - echo "$SET_SNIFFER_CORE_SWITCH" + line_break + separator_line "=" + if [ "$sniffer" = "OFF" ]; then + content_line "当前\033[33m已禁用\033[0m域名嗅探,是否确认启用:" + separator_line "-" + content_line "1) 是" + content_line "0) 否,返回上级菜单" + separator_line "=" + read -r -p "$COMMON_INPUT> " num + + if [ "$num" = 1 ]; then + line_break + separator_line "=" + if [ "$crashcore" = "clash" ]; then + rm -rf "$TMPDIR/CrashCore" "$CRASHDIR/CrashCore" "$CRASHDIR/CrashCore.tar.gz" + crashcore=meta + setconfig crashcore $crashcore + line_break + content_line "$SET_SNIFFER_CORE_SWITCH" + content_line "" + fi + sniffer=ON + else + continue fi - sniffer=ON - elif [ "$crashcore" = clashpre -a "$dns_mod" = redir_host ]; then - echo -e "\033[31m$SET_SNIFFER_LOCKED\033[0m" + elif [ "$crashcore" = clashpre ] && [ "$dns_mod" = redir_host ]; then + content_line "\033[31m$SET_SNIFFER_LOCKED\033[0m" + separator_line "=" + sleep 1 + continue else - sniffer=OFF + content_line "当前\033[33m已启用\033[0m域名嗅探,是否确认禁用:" + separator_line "-" + content_line "1) 是" + content_line "0) 否,返回上级菜单" + separator_line "=" + read -r -p "$COMMON_INPUT> " num + if [ "$num" = 1 ]; then + sniffer=OFF + line_break + separator_line "=" + else + continue + fi fi - setconfig sniffer $sniffer + setconfig sniffer "$sniffer" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 ;; 6) if pidof CrashCore >/dev/null; then - echo "-----------------------------------------------" - echo -e "\033[33m$SET_CORE_RUNNING\033[0m" - read -p "$SET_CORE_STOP_CONFIRM (1/0) > " res - [ "$res" = 1 ] && "$CRASHDIR/start.sh" stop && set_adv_config + line_break + separator_line "=" + content_line "\033[33m$SET_CORE_RUNNING\033[0m" + content_line "$SET_CORE_STOP_CONFIRM" + separator_line "-" + content_line "1) 是" + content_line "0) 否,返回上级菜单" + separator_line "=" + read -r -p "$COMMON_INPUT> " res + if [ "$res" = 1 ]; then + "$CRASHDIR/start.sh" stop && set_adv_config + else + continue + fi else set_adv_config fi @@ -97,83 +170,132 @@ settings() { set_ipv6 ;; a) - echo "-----------------------------------------------" - echo -e " 1 $SET_BACKUP" - echo -e " 2 $SET_RESTORE" - echo -e " 3 $SET_RESET" - echo -e " 0 $COMMON_BACK" - echo "-----------------------------------------------" - read -p "$COMMON_INPUT > " num + line_break + separator_line "=" + content_line "1) $SET_BACKUP" + content_line "2) $SET_RESTORE" + content_line "3) $SET_RESET" + content_line "0) $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num case "$num" in - 1) cp -f "$CFG_PATH" "$CFG_PATH.bak" && echo -e "\033[32m$SET_BACKUP_OK\033[0m" ;; - 2) - if [ -f "$CFG_PATH.bak" ]; then - mv -f "$CFG_PATH" "$CFG_PATH.bak2" - mv -f "$CFG_PATH.bak" "$CFG_PATH" - mv -f "$CFG_PATH.bak2" "$CFG_PATH.bak" - echo -e "\033[32m$SET_RESTORE_OK\033[0m" - else - echo -e "\033[31m$SET_BACKUP_MISS\033[0m" - fi - ;; - 3) - mv -f "$CFG_PATH" "$CFG_PATH.bak" + "" | 0) + continue + ;; + 1) + line_break + separator_line "=" + if cp -f "$CFG_PATH" "$CFG_PATH.bak"; then + content_line "\033[32m$SET_BACKUP_OK\033[0m" + else + content_line "\033[31m$SET_BACKUP_FAIL\033[0m" + fi + ;; + 2) + line_break + separator_line "=" + if [ -f "$CFG_PATH.bak" ]; then + mv -f "$CFG_PATH" "$CFG_PATH.bak2" + mv -f "$CFG_PATH.bak" "$CFG_PATH" + mv -f "$CFG_PATH.bak2" "$CFG_PATH.bak" + content_line "\033[32m$SET_RESTORE_OK\033[0m" + else + content_line "\033[31m$SET_BACKUP_MISS\033[0m" + fi + ;; + 3) + line_break + separator_line "=" + if mv -f "$CFG_PATH" "$CFG_PATH.bak"; then . "$CRASHDIR/init.sh" >/dev/null - echo -e "\033[32m$SET_RESET_OK\033[0m" - ;; + content_lin e"\033[32m$SET_RESET_OK\033[0m" + else + content_lin e"\033[32m$SET_RESET_FAIL\033[0m" + fi + ;; + *) + errornub + sleep 1 + continue + ;; esac - echo -e "\033[33m$SET_NEED_RESTART\033[0m" + content_line "" + content_line "\033[33m$SET_NEED_RESTART\033[0m" + sleep 1 exit 0 ;; b) - echo "-----------------------------------------------" - echo -e " 1 简体中文" - echo -e " 2 English" - echo -e " 0 $COMMON_BACK" - echo "-----------------------------------------------" - read -p "$COMMON_INPUT > " num + line_break + separator_line "=" + content_line "1) 简体中文" + content_line "2) English" + content_line "0) $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num case "$num" in - 1) - echo chs > "$CRASHDIR"/configs/i18n.cfg - echo -e "\033[32m切换成功!请重新运行脚本!\033[0m" - exit - ;; - 2) - echo en > "$CRASHDIR"/configs/i18n.cfg - echo -e "\033[32mLanguage switched successfully! Please re-run the script!\033[0m" - exit - ;; + "" | 0) + continue + ;; + 1) + line_break + separator_line "=" + echo chs >"$CRASHDIR"/configs/i18n.cfg + content_line "\033[32m切换成功!请重新运行脚本!\033[0m" + ;; + 2) + line_break + separator_line "=" + echo en >"$CRASHDIR"/configs/i18n.cfg + content_line "\033[32mLanguage switched successfully! Please re-run the script!\033[0m" + ;; esac + separator_line "=" + sleep 1 + exit 0 ;; c) - echo "-----------------------------------------------" - echo -e " 1 TUI-layout by Sofia-Riese" - echo -e " 2 TUI-lite" - echo -e " 0 $COMMON_BACK" - echo "-----------------------------------------------" - read -p "$COMMON_INPUT > " num + line_break + separator_line "=" + content_line "1) New Design by Sofia-Riese" + content_line "2) TUI-lite" + content_line "0) $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num case "$num" in - 1) - setconfig tui_type 'tui_layout' - . "$CRASHDIR"/menus/tui_layout.sh - ;; - 2) - setconfig tui_type 'tui_lite' - . "$CRASHDIR"/menus/tui_lite.sh - ;; + "" | 0) + continue + ;; + 1) + setconfig tui_type 'tui_layout' + . "$CRASHDIR"/menus/tui_layout.sh + ;; + 2) + setconfig tui_type 'tui_lite' + . "$CRASHDIR"/menus/tui_lite.sh + ;; esac + line_break + separator_line "=" + content_line "\033[32m切换成功!\033[0m" + separator_line "=" + sleep 1 + ;; + *) + errornum + sleep 1 ;; - *) errornum ;; esac - sleep 1 done } set_redir_config() { setconfig redir_mod "$redir_mod" setconfig dns_mod "$dns_mod" - echo "-----------------------------------------------" - echo -e "\033[36m$SET_REDIR_APPLIED $redir_mod\033[0m" + line_break + separator_line "=" + content_line "\033[36m$SET_REDIR_APPLIED $redir_mod\033[0m" + separator_line "=" + sleep 1 } # 路由模式设置 @@ -181,31 +303,33 @@ set_redir_mod() { while true; do [ -n "$(ls /dev/net/tun 2>/dev/null)" ] || ip tuntap >/dev/null 2>&1 || modprobe tun 2>/dev/null && sup_tun=1 [ -z "$firewall_area" ] && firewall_area=1 - [ "$firewall_area" = 4 ] && redir_mod="$MENU_PURE_MOD" + [ "$firewall_area" = 4 ] && redir_mod="$MENU_PURE_MOD" [ -z "$redir_mod" ] && redir_mod='Redir' firewall_area_dsc=$(echo "$SET_FW_AREA_DESC($bypass_host)" | cut -d'|' -f$firewall_area) - echo "-----------------------------------------------" - echo -e "$SET_REDIR_CURRENT \033[47;30m$redir_mod$MENU_MOD\033[0m; $SET_CORE_CURRENT \033[47;30m$crashcore\033[0m" - echo -e "\033[33m$SET_REDIR_RESTART_HINT\033[0m" - echo "-----------------------------------------------" - [ $firewall_area -le 3 ] && { - echo -e " 1 \033[32m$SET_REDIR_REDIR\033[0m:\t$SET_REDIR_REDIRDES" - echo -e " 2 \033[36m$SET_REDIR_MIX\033[0m:\t$SET_REDIR_MIXDES" - echo -e " 3 \033[32m$SET_REDIR_TPROXY\033[0m:\t$SET_REDIR_TPROXYDES" - echo -e " 4 \033[33m$SET_REDIR_TUN\033[0m:\t$SET_REDIR_TUNDES" - echo -e "-----------------------------------------------" - } - [ "$firewall_area" = 5 ] && { - echo -e " 5 \033[32mTCP旁路转发\033[0m: 仅转发TCP流量至旁路由" - echo -e " 6 \033[36mT&U旁路转发\033[0m: 转发TCP&UDP流量至旁路由" - echo "-----------------------------------------------" + line_break + separator_line "=" + content_line "\033[33m$SET_REDIR_RESTART_HINT\033[0m" + content_line "$SET_REDIR_CURRENT\033[47;30m$redir_mod$MENU_MOD\033[0m; $SET_CORE_CURRENT\033[47;30m$crashcore\033[0m" + separator_line "=" + [ "$firewall_area" -le 3 ] && { + content_line "1) \033[32m$SET_REDIR_REDIR\033[0m:\t$SET_REDIR_REDIRDES" + content_line "2) \033[36m$SET_REDIR_MIX\033[0m:\t$SET_REDIR_MIXDES" + content_line "3) \033[32m$SET_REDIR_TPROXY\033[0m:$SET_REDIR_TPROXYDES" + content_line "4) \033[33m$SET_REDIR_TUN\033[0m:\t$SET_REDIR_TUNDES" + content_line "" } - echo -e " 7 $SET_FW_AREA:\t\033[47;30m$firewall_area_dsc\033[0m" - echo -e " 8 $SET_VM_REDIR:\t\033[47;30m$vm_redir\033[0m" - echo -e " 9 $SET_FW_SWITCH:\t\033[47;30m$firewall_mod\033[0m" - echo "-----------------------------------------------" - echo -e " 0 $COMMON_BACK" - read -p "$COMMON_INPUT > " num + [ "$firewall_area" = 5 ] && { + content_line "5) \033[32mTCP旁路转发\033[0m: 仅转发TCP流量至旁路由" + content_line "6) \033[36mT&U旁路转发\033[0m: 转发TCP&UDP流量至旁路由" + content_line "" + } + content_line "7) $SET_FW_AREA:\t\033[47;30m$firewall_area_dsc\033[0m" + content_line "8) $SET_VM_REDIR:\t\033[47;30m$vm_redir\033[0m" + content_line "9) $SET_FW_SWITCH:\t\033[47;30m$firewall_mod\033[0m" + content_line "" + content_line "0 $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num case "$num" in "" | 0) @@ -220,14 +344,18 @@ set_redir_mod() { redir_mod=Mix set_redir_config else - echo -e "\033[31m${SET_NO_MOD}TUN$SET_NO_MOD2\033[0m" + line_break + separator_line "=" + content_line "\033[31m${SET_NO_MOD}TUN\033[0m" + content_line "\033[31m$SET_NO_MOD2\033[0m" + separator_line "=" sleep 1 fi ;; 3) if [ "$firewall_mod" = "iptables" ]; then - if [ -f /etc/init.d/qca-nss-ecm -a "$systype" = "mi_snapshot" ]; then - read -p "$XIAOMI_QOS(1/0) > " res + if [ -f /etc/init.d/qca-nss-ecm ] && [ "$systype" = "mi_snapshot" ]; then + read -r -p "$XIAOMI_QOS(1/0) > " res [ "$res" = '1' ] && { /data/shellcrash_init.sh tproxyfix redir_mod=Tproxy @@ -237,7 +365,11 @@ set_redir_mod() { redir_mod=Tproxy set_redir_config else - echo -e "\033[31m${SET_NO_MOD}iptables-mod-tproxy$SET_NO_MOD2\033[0m" + line_break + separator_line "=" + content_line "\033[31m${SET_NO_MOD}iptables-mod-tproxy\033[0m" + content_line "\033[31m$SET_NO_MOD2\033[0m" + separator_line "=" sleep 1 fi elif [ "$firewall_mod" = "nftables" ]; then @@ -245,7 +377,11 @@ set_redir_mod() { redir_mod=Tproxy set_redir_config else - echo -e "\033[31m${SET_NO_MOD}nft_tproxy$SET_NO_MOD2\033[0m" + line_break + separator_line "=" + content_line "\033[31m${SET_NO_MOD}nft_tproxy\033[0m" + content_line "\033[31m$SET_NO_MOD2\033[0m" + separator_line "=" sleep 1 fi fi @@ -255,7 +391,10 @@ set_redir_mod() { redir_mod=Tun set_redir_config else - echo -e "\033[31m$SET_NO_TUN\033[0m" + line_break + separator_line "=" + content_line "\033[31m$SET_NO_TUN\033[0m" + separator_line "=" sleep 1 fi ;; @@ -280,7 +419,10 @@ set_redir_mod() { redir_mod=Redir setconfig redir_mod $redir_mod else - echo -e "\033[31m$FW_NO_NFTABLES\033[0m" + line_break + separator_line "=" + content_line "\033[31m$FW_NO_NFTABLES\033[0m" + separator_line "=" fi elif [ "$firewall_mod" = 'nftables' ]; then if ckcmd iptables; then @@ -288,7 +430,10 @@ set_redir_mod() { redir_mod=Redir setconfig redir_mod $redir_mod else - echo -e "\033[31m$FW_NO_IPTABLES\033[0m" + line_break + separator_line "=" + content_line "\033[31m$FW_NO_IPTABLES\033[0m" + separator_line "=" fi else iptables -j REDIRECT -h >/dev/null 2>&1 && firewall_mod=iptables @@ -296,32 +441,40 @@ set_redir_mod() { if [ -n "$firewall_mod" ]; then redir_mod=Redir setconfig redir_mod $redir_mod - setconfig firewall_mod $firewall_mod + setconfig firewall_mod "$firewall_mod" else - echo -e "\033[31m$FW_NO_FIREWALL_BACKEND\033[0m" + line_break + separator_line "=" + content_line "\033[31m$FW_NO_FIREWALL_BACKEND\033[0m" + separator_line "=" fi fi sleep 1 - setconfig firewall_mod $firewall_mod + setconfig firewall_mod "$firewall_mod" ;; *) errornum sleep 1 - break ;; esac done } inputport() { - read -p "$INPUT_PORT(1-65535) > " portx + line_break + read -r -p "$INPUT_PORT(1~65535)> " portx . "$CRASHDIR"/menus/check_port.sh # 加载测试函数 + line_break + separator_line "=" if check_port "$portx"; then setconfig "$xport" "$portx" - echo -e "\033[32m$COMMON_SUCCESS\033[0m" + content_line "\033[32m$COMMON_SUCCESS\033[0m" + separator_line "=" + sleep 1 return 0 else - echo -e "\033[31m$COMMON_FAILED\033[0m" + content_line "\033[31m$COMMON_FAILED\033[0m" + separator_line "=" sleep 1 return 1 fi @@ -335,200 +488,282 @@ set_adv_config() { [ -z "$table" ] && table=100 [ -z "$authentication" ] && auth="$COMMON_UNSET" || auth="******" - echo "-----------------------------------------------" - echo -e " 1 $ADV_HTTP_PORT:\t\033[36m$mix_port\033[0m" - echo -e " 2 $ADV_HTTP_AUTH:\t\033[36m$auth\033[0m" - echo -e " 3 $ADV_REDIR_PORT:\t\033[36m$redir_port,$((redir_port+1))\033[0m" - echo -e " 4 $ADV_DNS_PORT:\t\033[36m$dns_port\033[0m" - echo -e " 5 $ADV_PANEL_PORT:\t\033[36m$db_port\033[0m" - echo -e " 6 $ADV_PANEL_PASS:\t\033[36m$secret\033[0m" - echo -e " 8 $ADV_HOST:\t\033[36m$host\033[0m" - echo -e " 9 $ADV_TABLE:\t\033[36m$table,$((table+1))\033[0m" - echo -e " 0 $COMMON_BACK" - read -p "$COMMON_INPUT > " num + line_break + separator_line "=" + content_line "1) $ADV_HTTP_PORT:\t\033[36m$mix_port\033[0m" + content_line "2) $ADV_HTTP_AUTH:\t\033[36m$auth\033[0m" + content_line "3) $ADV_REDIR_PORT:\t\033[36m$redir_port,$((redir_port + 1))\033[0m" + content_line "4) $ADV_DNS_PORT:\t\t\033[36m$dns_port\033[0m" + content_line "5) $ADV_PANEL_PORT:\t\t\033[36m$db_port\033[0m" + content_line "6) $ADV_PANEL_PASS:\t\t\033[36m$secret\033[0m" + content_line "8) $ADV_HOST:\t\033[36m$host\033[0m" + content_line "9) $ADV_TABLE:\t\t\033[36m$table,$((table + 1))\033[0m" + content_line "0) $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num case "$num" in "" | 0) break - ;; + ;; 1) xport=mix_port inputport - [ $? -eq 1 ] && break || continue - ;; + if [ $? -eq 1 ]; then + break + else + continue + fi + ;; 2) - echo "-----------------------------------------------" - echo -e "$ADV_AUTH_FORMAT_DESC" - echo -e "$ADV_AUTH_WARN" - echo -e "$ADV_AUTH_REMOVE_HINT" - echo "-----------------------------------------------" - read -p "$ADV_AUTH_INPUT > " input + line_break + separator_line "=" + content_line "$ADV_AUTH_FORMAT_DESC" + content_line "$ADV_AUTH_WARN" + content_line "$ADV_AUTH_REMOVE_HINT" + separator_line "=" + read -r -p "$ADV_AUTH_INPUT> " input + line_break + separator_line "=" if [ "$input" = "0" ]; then authentication="" setconfig authentication - echo -e "\033[32m$ADV_AUTH_REMOVED\033[0m" + content_line "\033[32m$ADV_AUTH_REMOVED\033[0m" else if [ "$local_proxy" = "ON" ] && [ "$local_type" = "$LOCAL_TYPE_ENV" ]; then - echo "-----------------------------------------------" - echo -e "\033[33m$ADV_AUTH_ENV_CONFLICT\033[0m" - sleep 1 + content_line "\033[33m$ADV_AUTH_ENV_CONFLICT\033[0m" else authentication=$(echo "$input" | grep :) if [ -n "$authentication" ]; then setconfig authentication "'$authentication'" - echo -e "\033[32m$COMMON_SUCCESS\033[0m" + content_line "\033[32m$COMMON_SUCCESS\033[0m" else - echo -e "\033[31m$ADV_AUTH_INVALID\033[0m" + content_line "\033[31m$ADV_AUTH_INVALID\033[0m" fi fi fi - ;; + separator_line "=" + sleep 1 + ;; 3) xport=redir_port inputport - [ $? -eq 1 ] && break || continue - ;; + if [ $? -eq 1 ]; then + break + else + continue + fi + ;; 4) xport=dns_port inputport - [ $? -eq 1 ] && break || continue - ;; + if [ $? -eq 1 ]; then + break + else + continue + fi + ;; 5) xport=db_port inputport - [ $? -eq 1 ] && break || continue - ;; + if [ $? -eq 1 ]; then + break + else + continue + fi + ;; 6) - read -p "$ADV_PANEL_PASS_INPUT > " secret + line_break + read -r -p "$ADV_PANEL_PASS_INPUT> " secret if [ -n "$secret" ]; then [ "$secret" = "0" ] && secret="" setconfig secret "$secret" - echo -e "\033[32m$COMMON_SUCCESS\033[0m" + line_break + separator_line "=" + content_line "\033[32m$COMMON_SUCCESS\033[0m" + separator_line "=" fi - ;; + ;; 8) - echo "-----------------------------------------------" - echo -e "\033[33m$ADV_HOST_WARN_LAN\033[0m" - echo -e "\033[31m$ADV_HOST_WARN_CHANGE\033[0m" - echo "-----------------------------------------------" - read -p "$ADV_HOST_INPUT > " host + line_break + separator_line "=" + content_line "\033[33m$ADV_HOST_WARN_LAN\033[0m" + content_line "\033[31m$ADV_HOST_WARN_CHANGE\033[0m" + separator_line "=" + read -r -p "$ADV_HOST_INPUT> " host + line_break + separator_line "=" if [ "$host" = "0" ]; then host="" setconfig host "$host" - echo -e "\033[32m$ADV_HOST_REMOVED\033[0m" + content_line "\033[32m$ADV_HOST_REMOVED\033[0m" + separator_line "=" + sleep 1 exit 0 - elif echo "$host" | grep -Eq '\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>){2}\.\<([1-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>' ; then + elif echo "$host" | grep -Eq '\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>){2}\.\<([1-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>'; then setconfig host "$host" - echo -e "\033[32m$COMMON_SUCCESS\033[0m" + content_line "\033[32m$COMMON_SUCCESS\033[0m" else host="" - echo -e "\033[31m$ADV_HOST_INVALID\033[0m" + content_line "\033[31m$ADV_HOST_INVALID\033[0m" fi + separator_line "=" sleep 1 - ;; + ;; 9) - echo "-----------------------------------------------" - echo -e "\033[33m$ADV_TABLE_WARN\033[0m" - read -p "$ADV_TABLE_INPUT > " table + line_break + separator_line "=" + content_line "\033[33m$ADV_TABLE_WARN\033[0m" + separator_line "=" + read -r -p "$ADV_TABLE_INPUT> " table if [ -n "$table" ]; then [ "$table" = "0" ] && table="100" setconfig table "$table" - echo -e "\033[32m$COMMON_SUCCESS\033[0m" + + line_break + separator_line "=" + content_line "\033[32m$COMMON_SUCCESS\033[0m" + separator_line "=" fi - ;; + ;; *) errornum sleep 1 - ;; + ;; esac done } set_firewall_area() { - [ -z "$vm_redir" ] && vm_redir='OFF' - echo "-----------------------------------------------" - echo -e "\033[33m$FW_AREA_NOTE\033[0m" - echo "-----------------------------------------------" - echo -e " 1 \033[32m$FW_AREA_LAN\033[0m" - echo -e " 2 \033[36m$FW_AREA_LOCAL\033[0m" - echo -e " 3 \033[32m$FW_AREA_BOTH\033[0m" - echo -e " 4 $FW_AREA_NONE" - echo -e " 0 $COMMON_BACK" - echo "-----------------------------------------------" - read -p "$COMMON_INPUT > " num + while true; do + [ -z "$vm_redir" ] && vm_redir='OFF' + line_break + separator_line "=" + content_line "\033[33m$FW_AREA_NOTE_1\033[0m" + content_line "\033[33m$FW_AREA_NOTE_2\033[0m" + content_line "" + content_line "当前路由劫持范围:$firewall_area_dsc" + separator_line "-" + content_line "1) \033[32m$FW_AREA_LAN\033[0m" + content_line "2) \033[36m$FW_AREA_LOCAL\033[0m" + content_line "3) \033[32m$FW_AREA_BOTH\033[0m" + content_line "4) $FW_AREA_NONE" + content_line "0) $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num - case "$num" in - [1-4]) - if [ $firewall_area -ge 4 ];then - redir_mod='' - else - redir_mod=Redir - fi - firewall_area="$num" - setconfig firewall_area "$firewall_area" - setconfig redir_mod "$redir_mod" - ;; - 5) - echo "-----------------------------------------------" - echo -e "\033[31m注意:\033[0m此功能存在多种风险如无网络基础请勿尝试!" - echo -e "\033[33m说明:\033[0m此功能不启动内核仅配置防火墙转发,且子设备无需额外设置网关DNS" - echo -e "\033[33m说明:\033[0m支持防火墙分流及设备过滤,支持部分定时任务,但不支持ipv6!" - echo -e "\033[31m注意:\033[0m如需代理UDP,请确保旁路由运行了支持UDP代理的模式!" - echo -e "\033[31m注意:\033[0m如使用systemd方式启动,内核依然会空载运行,建议使用保守模式!" - echo "-----------------------------------------------" - read -p "请输入旁路由IPV4地址 > " bypass_host - [ -n "$bypass_host" ] && { - firewall_area=$num - setconfig firewall_area $firewall_area - setconfig bypass_host $bypass_host - redir_mod=TCP旁路转发 - setconfig redir_mod $redir_mod - } - ;; - *) errornum ;; - esac - sleep 1 + case "$num" in + "" | 0) + break + ;; + [1-4]) + if [ "$firewall_area" -ge 4 ]; then + redir_mod='' + else + redir_mod=Redir + fi + firewall_area="$num" + setconfig firewall_area "$firewall_area" + setconfig redir_mod "$redir_mod" + + case "$firewall_area" in + 1) firewall_area_dsc="$FW_AREA_LAN" ;; + 2) firewall_area_dsc="$FW_AREA_LOCAL" ;; + 3) firewall_area_dsc="$FW_AREA_BOTH" ;; + 4) firewall_area_dsc="$FW_AREA_NONE" ;; + esac + + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 + ;; + 5) + line_break + separator_line "=" + content_line "\033[31m注意:\033[0m" + content_line "此功能存在多种风险如无网络基础请勿尝试!" + content_line "如需代理UDP,请确保旁路由运行了支持UDP代理的模式!" + content_line "如使用systemd方式启动,内核依然会空载运行,建议使用保守模式!" + content_line "\033[33m说明:\033[0m" + content_line "此功能不启动内核仅配置防火墙转发,且子设备无需额外设置网关DNS" + content_line "支持防火墙分流及设备过滤,支持部分定时任务,但不支持ipv6" + separator_line "=" + read -r -p "请直接输入旁路由IPV4地址> " bypass_host + [ -n "$bypass_host" ] && { + firewall_area=$num + setconfig firewall_area "$firewall_area" + setconfig bypass_host "$bypass_host" + redir_mod=TCP旁路转发 + setconfig redir_mod $redir_mod + } + ;; + *) + errornum + sleep 1 + ;; + esac + done } -set_firewall_vm(){ - [ -z "$vm_ipv4" ] && vm_ipv4=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'brd' | grep -E 'docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet' | sed 's/.*inet.//g' | sed 's/ br.*$//g' | sed 's/metric.*$//g' | tr '\n' ' ') - echo "-----------------------------------------------" - echo -e "$VM_DETECT_DESC\033[32m$vm_ipv4\033[0m" - echo "-----------------------------------------------" - echo -e " 1 \033[32m$VM_ENABLE_AUTO\033[0m" - echo -e " 2 \033[36m$VM_ENABLE_MANUAL\033[0m" - echo -e " 3 \033[31m$VM_DISABLE\033[0m" - echo -e " 0 $COMMON_BACK" - echo "-----------------------------------------------" - read -p "$COMMON_INPUT > " num + +set_firewall_vm() { + [ -z "$vm_ipv4" ] && vm_ipv4=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep 'brd' | grep -E 'docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet' | sed 's/.*inet.//g' | sed 's/ br.*$//g' | sed 's/metric.*$//g' | tr '\n' ' ') + line_break + separator_line "=" + content_line "$VM_DETECT_DESC\033[32m$vm_ipv4\033[0m" + separator_line "-" + content_line "1) \033[32m$VM_ENABLE_AUTO\033[0m" + content_line "2) \033[36m$VM_ENABLE_MANUAL\033[0m" + content_line "3) \033[31m$VM_DISABLE\033[0m" + content_line "0) $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num case "$num" in - 1) - if [ -n "$vm_ipv4" ]; then - vm_redir=ON - else - echo -e "\033[33m$VM_NO_NET_DETECTED\033[0m" - fi - ;; - 2) - echo -e "$VM_INPUT_DESC" - echo -e "\033[32m10.88.0.0/16 172.17.0.0/16\033[0m" - read -p "$VM_INPUT_NET > " text - [ -n "$text" ] && vm_ipv4="$text" && vm_redir=ON - ;; + 1) + line_break + separator_line "=" + if [ -n "$vm_ipv4" ]; then + vm_redir=ON + content_line "\033[32m操作成功\033[0m" + else + content_line "\033[33m$VM_NO_NET_DETECTED\033[0m" + fi + separator_line "=" + sleep 1 + ;; + 2) + line_break + separator_line "=" + content_line "$VM_INPUT_DESC_1" + content_line "$VM_INPUT_DESC_2 \033[32m10.88.0.0/16 172.17.0.0/16\033[0m" + content_line "" + content_line "Tips:直接回车确认可返回上级菜单" + separator_line "=" + read -r -p "$VM_INPUT_NET> " text + [ -n "$text" ] && vm_ipv4="$text" && vm_redir=ON + ;; 3) - vm_redir=OFF - vm_ipv4='' - ;; + vm_redir=OFF + vm_ipv4='' + + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 + ;; *) ;; esac - case "$num" in - 1-3) - setconfig vm_redir "$vm_redir" - setconfig vm_ipv4 "'$vm_ipv4'" - ;; - esac + case "$num" in + 1-3) + setconfig vm_redir "$vm_redir" + setconfig vm_ipv4 "'$vm_ipv4'" + ;; + esac } # ipv6设置 @@ -537,12 +772,13 @@ set_ipv6() { [ -z "$ipv6_redir" ] && ipv6_redir=OFF [ -z "$ipv6_dns" ] && ipv6_dns=ON - echo "-----------------------------------------------" - echo -e " 1 $IPV6_REDIR:\t\033[36m$ipv6_redir\033[0m" - [ "$disoverride" != "1" ] && echo -e " 2 $IPV6_DNS:\t\033[36m$ipv6_dns\033[0m" - echo -e " 0 $COMMON_BACK" - echo "-----------------------------------------------" - read -p "$COMMON_INPUT > " num + line_break + separator_line "=" + content_line "1) $IPV6_REDIR:\t\033[36m$ipv6_redir\033[0m" + [ "$disoverride" != "1" ] && content_line "2) $IPV6_DNS:\t\033[36m$ipv6_dns\033[0m" + content_line "0) $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num case "$num" in "" | 0) @@ -552,21 +788,31 @@ set_ipv6() { if [ "$ipv6_redir" = "OFF" ]; then ipv6_support=ON ipv6_redir=ON - sleep 2 else ipv6_redir=OFF fi setconfig ipv6_redir $ipv6_redir - setconfig ipv6_support $ipv6_support + setconfig ipv6_support "$ipv6_support" + + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 ;; 2) [ "$ipv6_dns" = OFF ] && ipv6_dns=ON || ipv6_dns=OFF setconfig ipv6_dns "$ipv6_dns" + + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 ;; *) errornum sleep 1 - break ;; esac done