From ee9d12d933c95239bf3ccecf7d8ffda502143c68 Mon Sep 17 00:00:00 2001 From: wonfen Date: Tue, 19 Nov 2024 11:38:23 +0800 Subject: [PATCH] feat: improve set dns logic --- UPDATELOG.md | 4 +++ scripts/set_dns.sh | 71 ++++++++++++++++++++++++++-------------------- 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index dd7c3375..01b8f893 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -2,6 +2,7 @@ ### Notice +- 历时3个月的紧密开发与严格测试稳定版2.0.0终于发布了:巨量改进与性能、稳定性提升,目前Clash Verge Rev已经有了比肩cfw的健壮性;而且更强大易用! - 由于更改了服务安装逻辑,Mac/Linux 首次安装需要输入 2 遍系统密码卸载和安装服务,以后可以丝滑使用 tun(虚拟网卡)模式 - 因 Tauri 2.0 底层 bug,关闭窗口暂时修改为最小化功能 @@ -29,6 +30,8 @@ - 添加统一延迟的设置开关 - 添加 Windows 下自动检测并下载 vc runtime 的功能 - 支持显示 mux 和 mptcp 的节点标识 +- 延迟测试连接更换 https 的 cp.cloudflare.com/generate_204 以防止机场劫持(关闭统一延迟的情况下延迟测试结果会有所增加)。 +- 重构日志记录逻辑,可以收集和筛选所有日志类型了(之前无法记录debug的日志类型) ### Performance @@ -39,6 +42,7 @@ - 移除无用的 PID 创建逻辑 - 优化系统 DNS 设置逻辑 - 后端实现窗口控制 +- 重构 MacOS 下的 DNS 设置逻辑 ### Bugs Fixes diff --git a/scripts/set_dns.sh b/scripts/set_dns.sh index 18a98fee..8440b228 100644 --- a/scripts/set_dns.sh +++ b/scripts/set_dns.sh @@ -1,57 +1,66 @@ #!/bin/bash -function is_valid_ip() { +# 验证IPv4地址格式 +function is_valid_ipv4() { local ip=$1 local IFS='.' local -a octets - if [[ ! $ip =~ ^([0-9]+\.){3}[0-9]+$ ]]; then - return 1 - fi - + [[ ! $ip =~ ^([0-9]+\.){3}[0-9]+$ ]] && return 1 read -r -a octets <<<"$ip" - - if [ "${#octets[@]}" -ne 4 ]; then - return 1 - fi + [ "${#octets[@]}" -ne 4 ] && return 1 for octet in "${octets[@]}"; do if ! [[ "$octet" =~ ^[0-9]+$ ]] || ((octet < 0 || octet > 255)); then return 1 fi done - return 0 } -if [ $# -lt 1 ]; then - echo "Usage: $0 " - exit 1 -fi +# 验证IPv6地址格式 +function is_valid_ipv6() { + local ip=$1 + if [[ ! $ip =~ ^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$ ]] && \ + [[ ! $ip =~ ^(([0-9a-fA-F]{0,4}:){0,7}:|(:[0-9a-fA-F]{0,4}:){0,6}:[0-9a-fA-F]{0,4})$ ]]; then + return 1 + fi + return 0 +} -if ! is_valid_ip "$1"; then - echo "$1 is not a valid IP address." - exit 1 -fi +# 验证IP地址是否为有效的IPv4或IPv6 +function is_valid_ip() { + is_valid_ipv4 "$1" || is_valid_ipv6 "$1" +} +# 检查参数 +[ $# -lt 1 ] && echo "Usage: $0 " && exit 1 +! is_valid_ip "$1" && echo "$1 is not a valid IP address." && exit 1 + +# 获取网络接口和硬件端口 nic=$(route -n get default | grep "interface" | awk '{print $2}') hardware_port=$(networksetup -listallhardwareports | awk -v dev="$nic" ' - /Hardware Port:/{ - port=$0; gsub("Hardware Port: ", "", port) - } - /Device: /{ - if ($2 == dev) { - print port; - exit - } - } + /Hardware Port:/{port=$0; gsub("Hardware Port: ", "", port)} + /Device: /{if ($2 == dev) {print port; exit}} ') +# 获取当前DNS设置 original_dns=$(networksetup -getdnsservers "$hardware_port") -if [ ${#original_dns} -le 15 ]; then - if [ -n "$original_dns" ]; then - echo $original_dns >original_dns.txt - networksetup -setdnsservers "$hardware_port" "$1" +# 检查当前DNS设置是否有效 +is_valid_dns=false +for ip in $original_dns; do + ip=$(echo "$ip" | tr -d '[:space:]') + if [ -n "$ip" ] && (is_valid_ipv4 "$ip" || is_valid_ipv6 "$ip"); then + is_valid_dns=true + break fi +done + +# 更新DNS设置 +if [ "$is_valid_dns" = false ]; then + echo "empty" > original_dns.txt +else + echo "$original_dns" > original_dns.txt fi +networksetup -setdnsservers "$hardware_port" "$1" \ No newline at end of file