自动化脚本如何清理DNS缓存

wen 实用脚本 4

本文目录导读:

自动化脚本如何清理DNS缓存

  1. Windows 系统
  2. macOS 系统
  3. Linux 系统(基于 systemd-resolved)
  4. 高级:跨平台自动检测脚本
  5. 自动化脚本的注意事项

清理DNS缓存的自动化脚本因操作系统不同而有所差异,以下是针对 Windows、macOS 和 Linux 的常见方法,你可以根据系统选择对应的脚本或命令。

Windows 系统

Windows 系统通过 ipconfig /flushdns 命令刷新缓存,以下是批处理脚本(.bat)和 PowerShell 脚本的示例。

批处理脚本 (.bat)

创建一个文本文件,复制以下代码,保存为 flush_dns.bat,然后右键以管理员身份运行。

@echo off
echo 正在清理 DNS 缓存...
ipconfig /flushdns
echo DNS 缓存清理完成。
pause

PowerShell 脚本 (.ps1)

创建 .ps1 文件,内容如下,运行前可能需要先设置执行策略(Set-ExecutionPolicy Unrestricted-ExecutionPolicy Bypass)。

Write-Host "正在清理 DNS 缓存..." -ForegroundColor Green
Clear-DnsClientCache
Write-Host "DNS 缓存清理完成。" -ForegroundColor Green

注意Clear-DnsClientCache 通常是 ipconfig /flushdns 的 PowerShell 等效项,如果该命令不可用,可使用 Start-Process -FilePath "ipconfig" -ArgumentList "/flushdns" -Verb RunAs

macOS 系统

macOS 清理 DNS 缓存的命令因系统版本而异,以下是常见的 Bash/Zsh 脚本。

创建一个可执行脚本文件(如 flush_dns_mac.sh):

#!/bin/bash
echo "正在清理 macOS DNS 缓存..."
# 根据 macOS 版本执行不同命令
if [[ $(sw_vers -productVersion) == 10.4* ]]; then
    lookupd -flushcache
elif [[ $(sw_vers -productVersion) == 10.5* ]] || [[ $(sw_vers -productVersion) == 10.6* ]]; then
    dscacheutil -flushcache
    sudo killall -HUP mDNSResponder
elif [[ $(sw_vers -productVersion) == 10.7* ]] || [[ $(sw_vers -productVersion) == 10.8* ]] || [[ $(sw_vers -productVersion) == 10.9* ]]; then
    sudo killall -HUP mDNSResponder
elif [[ $(sw_vers -productVersion) == 10.10* ]] || [[ $(sw_vers -productVersion) == 10.11* ]] || [[ $(sw_vers -productVersion) == 10.12* ]] || [[ $(sw_vers -productVersion) == 10.13* ]]; then
    sudo killall -HUP mDNSResponder
    sudo discoveryutil udnsflushcaches
else
    # macOS 10.14 (Mojave) 及更新版本
    sudo dscacheutil -flushcache
    sudo killall -HUP mDNSResponder
fi
echo "DNS 缓存清理完成。"

注意:脚本中使用了 sudo,运行时会要求输入管理员密码,建议使用 sudo 执行该脚本。

Linux 系统(基于 systemd-resolved)

大多数现代 Linux 发行版(如 Ubuntu 18.04+、Fedora、Arch Linux)使用 systemd-resolved 管理 DNS 缓存。

使用 systemd-resolved

#!/bin/bash
echo "正在清理 Linux DNS 缓存..."
sudo resolvectl flush-caches
echo "DNS 缓存清理完成。"

resolvectl 不可用,可尝试:

sudo systemd-resolve --flush-caches

重启 NetworkManager(如果使用 NetworkManager 管理 DNS)

#!/bin/bash
echo "正在重启 NetworkManager 以清理 DNS..."
sudo systemctl restart NetworkManager
echo "DNS 缓存已清理。"

针对其他 DNS 缓存服务

  • dnsmasqsudo systemctl restart dnsmasq
  • nscdsudo systemctl restart nscdsudo nscd -i hosts
  • Unboundsudo unbound-control flush_zonesudo systemctl restart unbound

高级:跨平台自动检测脚本

如果你需要在一个脚本中自动判断当前系统,可以使用以下 Python 脚本(兼容性较好):

import platform
import subprocess
import sys
def flush_dns():
    system = platform.system()
    print(f"检测到操作系统: {system}")
    if system == "Windows":
        subprocess.run(["ipconfig", "/flushdns"], check=True)
    elif system == "Darwin":  # macOS
        subprocess.run(["sudo", "dscacheutil", "-flushcache"], check=True)
        subprocess.run(["sudo", "killall", "-HUP", "mDNSResponder"], check=True)
    elif system == "Linux":
        try:
            subprocess.run(["sudo", "resolvectl", "flush-caches"], check=True)
        except FileNotFoundError:
            try:
                subprocess.run(["sudo", "systemd-resolve", "--flush-caches"], check=True)
            except FileNotFoundError:
                print("未找到 systemd-resolved 命令,尝试重启 NetworkManager...")
                subprocess.run(["sudo", "systemctl", "restart", "NetworkManager"], check=True)
    else:
        print(f"不支持的操作系统: {system}")
        sys.exit(1)
    print("DNS 缓存清理成功。")
if __name__ == "__main__":
    flush_dns()

使用前确保已安装 Python 3,并根据需要配置 sudo 免密码(例如在 sudoers 文件中添加相应规则)。

自动化脚本的注意事项

  1. 权限要求:Windows 需要管理员权限,macOS 和 Linux 需要 sudo 权限,建议在脚本中加入权限检查或使用 sudo
  2. 系统兼容性:macOS 不同版本命令有差异,Linux 不同发行版及 DNS 管理器不同,建议在目标系统上测试。
  3. 安全性:不要随意以管理员权限运行来源不明的脚本,防止恶意操作。
  4. 定时自动清理:如果希望定期自动清理,可以结合系统任务计划器(Windows 任务计划程序、Linux cron、macOS launchd)来运行这些脚本。

如果你有具体的操作系统或使用场景,可以提供更多细节,我可以帮你调整脚本。

抱歉,评论功能暂时关闭!