dns是否正常需通过命令退出码和输出判断:dig退出码9表示dns故障,host退出码2表示dns不可达;推荐用dig @dns_ip +short配合grep验证ipv4地址,或host -t a域名 dns_ip检测解析能力。

在 Linux 中,不能直接用 if [ ... ] 语法“判断 DNS 是否正常”,因为 DNS 解析本身不是布尔状态,而是依赖命令执行结果和输出内容。实际做法是:**调用 DNS 查询命令(如 dig、host 或 nslookup),检查其退出状态和返回内容是否符合预期**,再据此做条件分支。
用 dig 检查解析是否成功(推荐)
dig 退出码可靠、输出结构清晰,适合脚本判断:
- 退出码为 0 表示查询发出且收到响应(无论结果是 NOERROR 还是 NXDOMAIN)
- 退出码为 9 表示无可用 nameserver 或网络不可达(典型 DNS 故障)
- 结合
+short和管道过滤,可进一步验证是否返回了有效 IPv4 地址
示例脚本片段:
if dig +short example.com @8.8.8.8 | grep -qE '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'; thenecho "解析正常";
else
echo "解析失败或无有效A记录";
fi
用 host 做轻量级判断
host 输出简洁,退出码语义明确:
- 成功解析出 IP → 退出码 0
- 域名不存在(NXDOMAIN)→ 退出码 1
- 连接 DNS 失败 / 超时 / 无 nameserver → 退出码 2
常用写法:
if host -t A example.com 8.8.8.8 >/dev/null 2>&1; thenecho "能向指定DNS解析A记录";
else
echo "解析失败(可能是DNS不可达或配置错误)";
fi
绕过本地配置,直连验证 DNS 服务可达性
避免 /etc/resolv.conf 或缓存干扰,强制使用已知可靠的 DNS(如 114.114.114.114):
- 先确认 UDP 53 端口通:用
timeout 2 bash -c 'echo > /dev/udp/114.114.114.114/53' 2>/dev/null辅助探测(非绝对,但快速) - 再用
dig @114.114.114.114 example.com +short查看是否返回 IP - 若该命令超时或退出码非 0,基本说明本地到该 DNS 的路径中断(防火墙、路由、DNS 服务宕)
结合 ping 域名做辅助判断(慎用)
ping 会触发系统默认解析流程(含 /etc/hosts、nsswitch、缓存等),适合模拟真实应用行为,但不适用于精准归因:
-
ping -c1 -W1 example.com >/dev/null 2>&1成功 → 解析+网络都通 - 失败时需配合
ping -c1 -W1 8.8.8.8判断是 DNS 还是网络层问题 - 注意:
ping不区分 NXDOMAIN 和 timeout,退出码均为 1 或 2,信息粒度粗











