DNS(域名系统)是互联网的核心基础设施之一,负责将人类可读的域名转换为机器可识别的IP地址,在Linux/Unix环境中,Shell脚本因其灵活性和强大的自动化能力,常被用于管理DNS记录、批量查询域名信息或监控系统状态,本文将详细介绍如何使用Shell脚本实现DNS相关的自动化操作,包括记录查询、批量解析、配置文件管理等实用场景,并提供代码示例和最佳实践。

DNS Shell脚本基础应用
DNS Shell脚本的核心在于利用命令行工具(如dig、nslookup、host)与DNS服务器交互,以下是基础操作的实现思路:
单域名DNS查询脚本
使用dig命令可以获取详细的DNS记录信息,以下是一个简单的脚本示例,用于查询A记录:
#!/bin/bash
# 检查参数
if [ $# -ne 1 ]; then
echo "Usage: $0 <domain>"
exit 1
fi
domain=$1
# 执行查询并过滤A记录
dig +short "$domain" A
将上述脚本保存为query_a.sh,赋予执行权限后(chmod +x query_a.sh),即可通过./query_a.sh example.com查询目标域名的A记录。
批量域名解析脚本
当需要处理多个域名时,可以通过循环结构实现批量查询,批量检查一组域名的MX记录:
#!/bin/bash
# 域名列表文件
domain_list="domains.txt"
# 检查文件是否存在
if [ ! -f "$domain_list" ]; then
echo "Error: Domain list file not found!"
exit 1
fi
# 逐行读取并查询
while read -r domain; do
echo "Querying MX for $domain..."
dig +short "$domain" MX
done < "$domain_list"
此脚本要求domains.txt文件中每行包含一个域名,脚本会逐行读取并输出MX记录。

高级DNS自动化场景
DNS记录监控与报警
通过定时任务(如cron)结合脚本,可以监控域名的DNS记录是否被篡改,对比当前A记录与历史记录:
#!/bin/bash
domain="example.com"
record_file="a_records.log"
# 获取当前记录并保存
current_record=$(dig +short "$domain" A)
echo "$(date): $current_record" >> "$record_file"
# 检查是否与上一条记录不同
last_record=$(tail -n 2 "$record_file" | head -n 1 | awk '{print $2}')
if [ "$current_record" != "$last_record" ]; then
echo "ALERT: A record changed for $domain!" | mail -s "DNS Change Alert" admin@example.com
fi
需配置mail命令以发送报警邮件。
动DNS(DDNS)更新脚本
对于动态IP环境,可通过脚本自动更新DNS记录,以下示例使用Cloudflare API更新A记录:
#!/bin/bash
api_token="your_api_token"
zone_id="your_zone_id"
record_name="home.example.com"
record_type="A"
ip=$(curl -s https://api.ipify.org)
# 获取记录ID
record_id=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records?name=$record_name"
-H "Authorization: Bearer $api_token" | jq -r '.result[0].id')
# 更新记录
curl -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records/$record_id"
-H "Authorization: Bearer $api_token"
-H "Content-Type: application/json"
--data '{"type":"'"$record_type"'","name":"'"$record_name"'","content":"'"$ip"'","ttl":120,"proxied":false}'
需安装jq工具处理JSON响应。
最佳实践与注意事项
- 错误处理:使用
set -e确保脚本在命令失败时退出,并通过trap捕获信号(如Ctrl+C)。 - 日志记录:将关键操作记录到日志文件,便于审计和排查问题。
- 安全性:避免在脚本中硬编码敏感信息(如API密钥),建议使用环境变量或配置文件。
- 性能优化:对于批量查询,可使用并行工具(如
xargs -P)加速处理。
常见DNS Shell脚本工具对比
| 工具 | 特点 | 适用场景 |
|---|---|---|
dig |
输出详细,支持+short简化输出 | 精确查询特定记录类型 |
nslookup |
交互式友好,适合调试 | 手动查询与故障排查 |
host |
简洁输出,适合快速验证 | 脚本中基础记录查询 |
相关问答FAQs
Q1: 如何在Shell脚本中处理DNS查询的超时问题?
A1: 可以通过dig的+timeout参数设置超时时间(单位为秒),例如dig +timeout=5 +short example.com A,若需更精细控制,可结合timeout命令(如timeout 10 dig ...)强制终止长时间运行的查询。

Q2: 如何验证DNS服务器的响应时间并筛选延迟最低的服务器?
A2: 使用dig的+stats选项可获取查询耗时,通过脚本解析输出并计算平均值,示例代码如下:
#!/bin/bash
servers=("8.8.8.8" "1.1.1.1" "9.9.9.9")
min_time=9999
best_server=""
for server in "${servers[@]}"; do
time=$(dig @"$server" +time=1 +stats example.com | grep "Query time" | awk '{print $4}' | tr -d 'ms;')
if [ "$time" -lt "$min_time" ]; then
min_time=$time
best_server=$server
fi
done
echo "Fastest server: $best_server (${min_time}ms)"
此脚本会测试多个DNS服务器的响应时间并输出最优结果。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/249522.html