From 5647f603735ea58c293674378b7d2c57bdc48a74 Mon Sep 17 00:00:00 2001 From: sofia <253282481+sofia-riese@users.noreply.github.com> Date: Fri, 23 Jan 2026 14:42:27 +0800 Subject: [PATCH] feat(dns.sh): redesign static text menu --- scripts/lang/chs/dns.lang | 12 +- scripts/menus/dns.sh | 474 ++++++++++++++++++++++++++++++-------- 2 files changed, 382 insertions(+), 104 deletions(-) diff --git a/scripts/lang/chs/dns.lang b/scripts/lang/chs/dns.lang index 5f183953..2fe64656 100644 --- a/scripts/lang/chs/dns.lang +++ b/scripts/lang/chs/dns.lang @@ -23,17 +23,16 @@ DNS_SET_OK="DNS模式已设置为" DNS_CORE_UNSUPPORTED="当前内核不支持该功能!" #=====DNS重定向===== -DNS_REDIR_WARN="仅限搭配第三方DNS服务(AdGuard、SmartDNS等)使用!" +DNS_REDIR_WARN="仅限搭配第三方DNS服务(AdGuard、SmartDNS等)使用!" DNS_REDIR_HINT="建议第三方DNS上游指向" -DNS_REDIR_INPUT="请输入第三方DNS服务监听端口(0重置)>" DNS_REDIR_NO_SERVICE="该端口未检测到正在运行的DNS服务!" #=====Fake-IP===== DNS_FAKEIP_DESC="用于解决Fake-IP模式下部分地址或应用无法连接的问题" DNS_FAKEIP_TIP="脚本已内置大量地址,只需添加出现问题的地址" -DNS_FAKEIP_EXAMPLE="示例:a.b.com\n*.b.com\n*.*.b.com" +DNS_FAKEIP_EXAMPLE="示例格式如下:\na.b.com\n*.b.com\n*.*.b.com" DNS_FAKEIP_EXIST="已添加的Fake-IP过滤地址:" -DNS_FAKEIP_EMPTY="尚未添加Fake-IP过滤地址" +DNS_FAKEIP_EMPTY="当前尚未添加任何自定义Fake-IP过滤地址" DNS_FAKEIP_EDIT="输入序号移除,输入地址添加" #=====DNS高级===== @@ -42,12 +41,11 @@ DNS_ADV_CERT="使用DoH/DoT需具备本地根证书文件" DNS_ADV_SINGBOX_LIMIT="注意:SingBox内核仅加载第一个DNS" DNS_ADV_EDIT_DIRECT="修改DIRECT-DNS" -DNS_ADV_EDIT_PROXY="修改PROXY-DNS(该DNS查询会经过节点)" -DNS_ADV_EDIT_DEFAULT="修改DEFAULT-DNS(必须是IP,用于解析其他DNS)" +DNS_ADV_EDIT_PROXY="修改PROXY-DNS(该DNS查询会经过节点)" +DNS_ADV_EDIT_DEFAULT="修改DEFAULT-DNS(必须是IP,用于解析其他DNS)" DNS_ADV_AUTO_ENCRYPT="一键配置加密DNS" DNS_ADV_RESET="重置默认DNS配置" -DNS_INPUT_NEW="请输入新的DNS地址>" DNS_IPV6_NOT_SUPPORT="该选项暂不支持IPv6加密DNS!" DNS_ENCRYPT_OK="已设置加密DNS,如遇DNS解析问题,请重置DNS配置!" diff --git a/scripts/menus/dns.sh b/scripts/menus/dns.sh index 6dec58af..604a7e11 100644 --- a/scripts/menus/dns.sh +++ b/scripts/menus/dns.sh @@ -12,79 +12,233 @@ set_dns_mod() { [ -z "$hosts_opt" ] && hosts_opt=ON [ -z "$dns_protect" ] && dns_protect=ON [ -z "$ecs_subnet" ] && ecs_subnet=OFF - - echo "-----------------------------------------------" - echo -e "$DNS_CURRENT_MODE \033[47;30m $dns_mod \033[0m" - echo -e "\033[33m$DNS_RESTART_NOTICE\033[0m" - echo "-----------------------------------------------" - echo -e " 1 MIX$COMMON_MOD:\t\033[32m$DNS_MODE_MIX_DESC\033[0m" - echo -e " 2 Route$COMMON_MOD:\t\033[32m$DNS_MODE_ROUTE_DESC\033[0m" - echo -e " 3 Redir$COMMON_MOD:\t\033[33m$DNS_MODE_REDIR_DESC\033[0m" - echo "-----------------------------------------------" - echo -e " 4 $DNS_MENU_PROTECT:\t\033[36m$dns_protect\033[0m\t$DNS_PROTECT_DESC" - echo -e " 5 $DNS_MENU_HOSTS:\t\033[36m$hosts_opt\033[0m\t$DNS_HOSTS_DESC" - echo -e " 6 $DNS_MENU_ECS:\t\033[36m$ecs_subnet\033[0m\t$DNS_ECS_DESC" - echo -e " 7 $DNS_MENU_REDIR:\033[36m$dns_redir_port\033[0m\t$DNS_REDIR_PORT_DESC" + line_break + separator_line "=" + content_line "$DNS_CURRENT_MODE\033[47;30m $dns_mod \033[0m" + content_line "\033[33m$DNS_RESTART_NOTICE\033[0m" + separator_line "-" + content_line "1) MIX$COMMON_MOD:\t\033[32m$DNS_MODE_MIX_DESC\033[0m" + content_line "2) Route$COMMON_MOD:\t\033[32m$DNS_MODE_ROUTE_DESC\033[0m" + content_line "3) Redir$COMMON_MOD:\t\033[33m$DNS_MODE_REDIR_DESC\033[0m" + content_line "" + content_line "4) $DNS_MENU_PROTECT:\t\033[36m$dns_protect\033[0m\t$DNS_PROTECT_DESC" + content_line "5) $DNS_MENU_HOSTS:\t\033[36m$hosts_opt\033[0m\t$DNS_HOSTS_DESC" + content_line "6) $DNS_MENU_ECS:\t\033[36m$ecs_subnet\033[0m\t$DNS_ECS_DESC" + content_line "7) $DNS_MENU_REDIR:\033[36m$dns_redir_port\033[0m\t$DNS_REDIR_PORT_DESC" [ "$dns_mod" = "mix" ] && - echo -e " 8 \033[33m$DNS_FAKEIP_MENU\033[0m" - echo -e " 9 \033[36m$DNS_ADV_MENU\033[0m" - echo "-----------------------------------------------" - echo " 0 $COMMON_BACK" - read -r -p "$COMMON_INPUT > " num + content_line "8) \033[33m$DNS_FAKEIP_MENU\033[0m" + content_line "9) \033[36m$DNS_ADV_MENU\033[0m" + content_line "0) $COMMON_BACK" + separator_line "=" + read -r -p "$COMMON_INPUT> " num case "$num" in "" | 0) break ;; 1 | 2) + line_break + separator_line "=" if echo "$crashcore" | grep -q 'singbox' || [ "$crashcore" = meta ]; then [ "$num" = 1 ] && dns_mod=mix || dns_mod=route setconfig dns_mod "$dns_mod" - echo "-----------------------------------------------" - echo -e "\033[36m$DNS_SET_OK: $dns_mod\033[0m" + content_line "\033[36m$DNS_SET_OK:$dns_mod\033[0m" else - echo -e "\033[31m$DNS_CORE_UNSUPPORTED\033[0m" - sleep 1 + econtent_line "\033[31m$DNS_CORE_UNSUPPORTED\033[0m" fi + separator_line "=" + sleep 1 ;; 3) dns_mod=redir_host setconfig dns_mod "$dns_mod" - echo -e "\033[36m$DNS_SET_OK: $dns_mod\033[0m" + line_break + separator_line "=" + content_line "\033[36m$DNS_SET_OK:$dns_mod\033[0m" + separator_line "=" ;; 4) - [ "$dns_protect" = ON ] && dns_protect=OFF || dns_protect=ON - setconfig dns_protect "$dns_protect" + while true; do + line_break + separator_line "=" + if [ "$dns_protect" = ON ]; then + content_line "当前\033[33m已启用\033[0mDNS防泄漏,是否确认禁用:" + else + content_line "当前\033[33m已禁用\033[0mDNS防泄漏,是否确认启用:" + fi + separator_line "-" + content_line "1) 是" + content_line "2) 重置为默认值" + content_line "0) 否,返回上级菜单" + separator_line "=" + read -r -p "$COMMON_INPUT> " num + case "$num" in + 0) + break + ;; + 1) + if [ "$dns_protect" = ON ]; then + dns_protect=OFF + else + dns_protect=ON + fi + ;; + 2) + dns_protect=ON + ;; + *) + errornum + sleep 1 + continue + ;; + esac + setconfig dns_protect "$dns_protect" + + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 + done ;; 5) - [ "$hosts_opt" = ON ] && hosts_opt=OFF || hosts_opt=ON - setconfig hosts_opt "$hosts_opt" + while true; do + line_break + separator_line "=" + if [ "$hosts_opt" = ON ]; then + content_line "当前\033[33m已启用\033[0mHosts优化,是否确认禁用:" + else + content_line "当前\033[33m已禁用\033[0mHosts优化,是否确认启用:" + fi + separator_line "-" + content_line "1) 是" + content_line "2) 重置为默认值" + content_line "0) 否,返回上级菜单" + separator_line "=" + read -r -p "$COMMON_INPUT> " num + case "$num" in + 0) + break + ;; + 1) + if [ "$hosts_opt" = ON ]; then + hosts_opt=OFF + else + hosts_opt=ON + fi + ;; + 2) + hosts_opt=ON + ;; + *) + errornum + sleep 1 + continue + ;; + esac + setconfig dns_protect "$hosts_opt" + + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 + done ;; 6) - [ "$ecs_subnet" = ON ] && ecs_subnet=OFF || ecs_subnet=ON - setconfig ecs_subnet "$ecs_subnet" + + while true; do + line_break + separator_line "=" + if [ "$ecs_subnet" = ON ]; then + content_line "当前\033[33m已启用\033[0mHosts优化,是否确认禁用:" + else + content_line "当前\033[33m已禁用\033[0mHosts优化,是否确认启用:" + fi + separator_line "-" + content_line "1) 是" + content_line "2) 重置为默认值" + content_line "0) 否,返回上级菜单" + separator_line "=" + read -r -p "$COMMON_INPUT> " num + case "$num" in + 0) + break + ;; + 1) + if [ "$ecs_subnet" = ON ]; then + ecs_subnet=OFF + else + ecs_subnet=ON + fi + ;; + 2) + ecs_subnet=OFF + ;; + *) + errornum + sleep 1 + continue + ;; + esac + setconfig dns_protect "$ecs_subnet" + + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 + done ;; 7) - echo "-----------------------------------------------" - echo -e "\033[31m$DNS_REDIR_WARN\033[0m" - echo -e "\033[33m$DNS_REDIR_HINT 127.0.0.1:$dns_port\033[0m" - echo "-----------------------------------------------" + while true; do + line_break + separator_line "=" + content_line "\033[31m$DNS_REDIR_WARN\033[0m" + content_line "\033[33m$DNS_REDIR_HINT 127.0.0.1:$dns_port\033[0m" + content_line "" + content_line "请直接输入旁路由IPV4地址" + content_line "或输入 r 重置DNS劫持端口" + content_line "或输入 0 返回上级菜单" + separator_line "=" + read -r -p "请输入> " num + case "$num" in + 0) + break + ;; + r) + dns_redir_port="$dns_port" + setconfig dns_redir_port - read -r -p "$DNS_REDIR_INPUT" num - - if [ "$num" = 0 ]; then - dns_redir_port="$dns_port" - setconfig dns_redir_port - elif [ "$num" -ge 1 ] && [ "$num" -lt 65535 ]; then - if ckcmd netstat && netstat -ntul | grep -q ":$num "; then - dns_redir_port="$num" - setconfig dns_redir_port "$dns_redir_port" - else - echo -e "\033[33m$DNS_REDIR_NO_SERVICE\033[0m" - fi - else - errornum - fi - sleep 1 + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 + break + ;; + *) + if [ "$num" -ge 1 ] && [ "$num" -lt 65535 ]; then + line_break + separator_line "=" + if ckcmd netstat && netstat -ntul | grep -q ":$num "; then + dns_redir_port="$num" + setconfig dns_redir_port "$dns_redir_port" + content_line "\033[32m操作成功\033[0m" + separator_line "=" + sleep 1 + break + else + content_line "\033[33m$DNS_REDIR_NO_SERVICE\033[0m" + separator_line "=" + sleep 1 + fi + else + errornum + sleep 1 + fi + ;; + esac + done ;; 8) fake_ip_filter @@ -102,31 +256,60 @@ set_dns_mod() { fake_ip_filter() { while true; do - echo -e "\033[32m$DNS_FAKEIP_DESC\033[0m" - echo -e "\033[31m$DNS_FAKEIP_TIP\033[0m" - echo -e "\033[36m$DNS_FAKEIP_EXAMPLE\033[0m" - echo "-----------------------------------------------" + line_break + separator_line "=" + content_line "\033[32m$DNS_FAKEIP_DESC\033[0m" + content_line "\033[31m$DNS_FAKEIP_TIP\033[0m" + content_line "\033[36m$DNS_FAKEIP_EXAMPLE\033[0m" + + separator_line "-" if [ -s "$CRASHDIR/configs/fake_ip_filter" ]; then - echo -e "\033[33m$DNS_FAKEIP_EXIST\033[0m" - awk '{print NR" "$1}' "$CRASHDIR/configs/fake_ip_filter" + content_line "\033[33m$DNS_FAKEIP_EXIST\033[0m" + content_line "" + awk '{print NR") "$1}' "$CRASHDIR/configs/fake_ip_filter" | + while IFS= read -r line; do + content_line "$line" + done else - echo -e "\033[33m$DNS_FAKEIP_EMPTY\033[0m" + content_line "\033[33m$DNS_FAKEIP_EMPTY\033[0m" fi - echo "-----------------------------------------------" - read -r -p "$DNS_FAKEIP_EDIT > " input + content_line "" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "$DNS_FAKEIP_EDIT> " input case "$input" in "" | 0) break ;; *) + line_break + separator_line "=" if [ "$input" -ge 1 ] 2>/dev/null; then - sed -i "${input}d" "$CRASHDIR/configs/fake_ip_filter" - echo -e "\033[32m$COMMON_REMOVE_OK\033[0m" + if sed -i "${input}d" "$CRASHDIR/configs/fake_ip_filter"; then + content_line "\033[32m移除成功\033[0m" + else + content_line "\033[31m移除失败\033[0m" + fi else - echo -e "$COMMON_YOUR_INPUT \033[32m$input\033[0m" - read -r -p "$COMMON_CONFIRM" res - [ "$res" = 1 ] && echo "$input" >>"$CRASHDIR/configs/fake_ip_filter" + content_line "请确认需要添加的地址:\033[32m$input\033[0m" + separator_line "-" + content_line "1) 确认无误" + content_line "0) 返回上级菜单" + separator_line "=" + read -r -p "$COMMON_INPUT>" res + if [ "$res" = 1 ]; then + line_break + separator_line "=" + if echo "$input" >>"$CRASHDIR/configs/fake_ip_filter"; then + content_line "\033[32m添加成功\033[0m" + else + content_line "\033[31m添加失败\033[0m" + fi + else + break + fi fi + separator_line "=" sleep 1 ;; esac @@ -136,53 +319,146 @@ fake_ip_filter() { # DNS详细设置 set_dns_adv() { while true; do - echo "-----------------------------------------------" - echo -e "DIRECT-DNS :\033[32m$dns_nameserver\033[0m" - echo -e "PROXY-DNS :\033[36m$dns_fallback\033[0m" - echo -e "DEFAULT-DNS:\033[33m$dns_resolver\033[0m" + line_break + separator_line "=" + content_line "\033[31m$DNS_ADV_SINGBOX_LIMIT\033[0m" + content_line "$DNS_ADV_SPLIT" + content_line "\033[33m$DNS_ADV_CERT\033[0m" + content_line "" + content_line "DIRECT-DNS:" + content_line "\033[32m$dns_nameserver\033[0m" + content_line "" - echo -e "$DNS_ADV_SPLIT" - echo -e "\033[33m$DNS_ADV_CERT\033[0m" - echo -e "\033[31m$DNS_ADV_SINGBOX_LIMIT\033[0m" + content_line "PROXY-DNS:" + content_line "\033[36m$dns_fallback\033[0m" + content_line "" - echo "-----------------------------------------------" - echo -e " 1 $DNS_ADV_EDIT_DIRECT" - echo -e " 2 $DNS_ADV_EDIT_PROXY" - echo -e " 3 $DNS_ADV_EDIT_DEFAULT" - echo -e " 4 \033[32m$DNS_ADV_AUTO_ENCRYPT\033[0m" - echo -e " 9 \033[33m$DNS_ADV_RESET\033[0m" - echo -e " 0 $COMMON_BACK" - echo "-----------------------------------------------" + content_line "DEFAULT-DNS:" + content_line "\033[33m$dns_resolver\033[0m" + content_line "" + separator_line "-" + content_line "1) $DNS_ADV_EDIT_DIRECT" + content_line "2) $DNS_ADV_EDIT_PROXY" + content_line "3) $DNS_ADV_EDIT_DEFAULT" + content_line "4) \033[32m$DNS_ADV_AUTO_ENCRYPT\033[0m" + content_line "9) \033[33m$DNS_ADV_RESET\033[0m" + content_line "0) $COMMON_BACK" + separator_line "=" read -r -p "$COMMON_INPUT > " num - case "$num" in "" | 0) break ;; 1) - read -r -p "$DNS_INPUT_NEW" dns_nameserver - dns_nameserver=$(echo "$dns_nameserver" | sed 's#|#,\ #g') - [ -n "$dns_nameserver" ] && setconfig dns_nameserver "'$dns_nameserver'" - echo -e "\033[32m$COMMON_SUCCESS\033[0m" + line_break + separator_line "=" + content_line "当前DIRECT-DNS:\033[32m$dns_nameserver\033[0m" + separator_line "-" + content_line "请直接输入新的DIRECT-DNS地址" + content_line "或输入 r 重置DIRECT-DNS地址" + content_line "或输入 0 返回上级菜单" + separator_line "=" + read -r -p "请输入> " res + case "$res" in + 0) + continue + ;; + r) + dns_nameserver="127.0.0.1" + setconfig dns_nameserver "'$dns_nameserver'" + + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + ;; + *) + dns_nameserver=$(echo "$res" | sed 's#|#,\ #g') + line_break + separator_line "=" + if [ -n "$dns_nameserver" ]; then + setconfig dns_nameserver "'$dns_nameserver'" + content_line "\033[32m操作成功\033[0m" + else + ontent_line "\033[32m操作失败\033[0m" + fi + ;; + esac + separator_line "=" ;; 2) - read -r -p "$DNS_INPUT_NEW" dns_fallback - dns_fallback=$(echo "$dns_fallback" | sed 's#|#,\ #g') - [ -n "$dns_fallback" ] && setconfig dns_fallback "'$dns_fallback'" - echo -e "\033[32m$COMMON_SUCCESS\033[0m" + line_break + separator_line "=" + content_line "当前PROXY-DNS:\033[32m$dns_fallback\033[0m" + separator_line "-" + content_line "请直接输入新的PROXY-DNS地址" + content_line "或输入 r 重置PROXY-DNS地址" + content_line "或输入 0 返回上级菜单" + separator_line "=" + read -r -p "请输入> " res + case "$res" in + 0) + continue + ;; + r) + dns_fallback="1.1.1.1, 8.8.8.8" + setconfig dns_fallback "'$dns_fallback'" + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + ;; + *) + dns_fallback=$(echo "$res" | sed 's#|#,\ #g') + line_break + separator_line "=" + if [ -n "$dns_fallback" ]; then + setconfig dns_fallback "'$dns_fallback'" + content_line "\033[32m操作成功\033[0m" + else + ontent_line "\033[32m操作失败\033[0m" + fi + ;; + esac + separator_line "=" ;; 3) - read -r -p "$DNS_INPUT_NEW" text - if echo "$text" | grep -qE '://.*::'; then - echo -e "\033[31m$DNS_IPV6_NOT_SUPPORT\033[0m" - else - dns_resolver=$(echo "$text" | sed 's#|#,\ #g') + line_break + separator_line "=" + content_line "当前DEFAULT-DNS:\033[32m$dns_resolver\033[0m" + separator_line "-" + content_line "请直接输入新的DEFAULT-DNS地址" + content_line "或输入 r 重置DEFAULT-DNS地址" + content_line "或输入 0 返回上级菜单" + separator_line "=" + read -r -p "请输入> " res + case "$res" in + 0) + continue + ;; + "r") + dns_resolver="223.5.5.5, 2400:3200::1" setconfig dns_resolver "'$dns_resolver'" - echo -e "\033[32m$COMMON_SUCCESS\033[0m" - fi + line_break + separator_line "=" + content_line "\033[32m操作成功\033[0m" + ;; + *) + line_break + separator_line "=" + if echo "$res" | grep -qE '://.*::'; then + content_line "\033[31m$DNS_IPV6_NOT_SUPPORT\033[0m" + else + dns_resolver=$(echo "$res" | sed 's#|#,\ #g') + setconfig dns_resolver "'$dns_resolver'" + content_line "\033[32m$COMMON_SUCCESS\033[0m" + fi + ;; + esac + separator_line "=" ;; 4) + line_break + separator_line "=" if echo "$crashcore" | grep -qE 'meta|singbox'; then dns_nameserver='https://dns.alidns.com/dns-query, https://doh.pub/dns-query' dns_fallback='https://cloudflare-dns.com/dns-query, https://dns.google/dns-query, https://doh.opendns.com/dns-query' @@ -190,17 +466,21 @@ set_dns_adv() { setconfig dns_nameserver "'$dns_nameserver'" setconfig dns_fallback "'$dns_fallback'" setconfig dns_resolver "'$dns_resolver'" - echo -e "\033[32m$DNS_ENCRYPT_OK\033[0m" + content_line "\033[32m$DNS_ENCRYPT_OK\033[0m" else - echo -e "\033[31m$DNS_CORE_REQUIRE\033[0m" + content_line "\033[31m$DNS_CORE_REQUIRE\033[0m" fi + separator_line "=" ;; 9) setconfig dns_nameserver setconfig dns_fallback setconfig dns_resolver . "$CRASHDIR/libs/get_config.sh" - echo -e "\033[32m$COMMON_SUCCESS\033[0m" + line_break + separator_line "=" + content_line "\033[32m$COMMON_SUCCESS\033[0m" + separator_line "=" ;; *) errornum