编写Bash脚本从BIND区域文件提取指定记录生成DNS执行命令
BASH脚本:批量从BIND区域文件提取DNS记录并生成新服务器命令
我刚好处理过类似的批量DNS迁移需求,针对你要从700+BIND区域文件提取A、MX、TXT记录(跳过NS),并生成新服务器支持的/usr/bin/dns命令的场景,写了这个脚本,直接就能用:
#!/bin/bash # 配置:BIND区域文件所在目录,替换成你的实际路径 ZONE_DIR="/var/named/zones" # 生成的迁移命令输出文件 OUTPUT_FILE="dns_migration_commands.sh" # 清空输出文件(避免之前的内容干扰) > "$OUTPUT_FILE" # 遍历所有BIND区域文件(假设后缀是.db,若你的文件是.zone等,修改这里的后缀) for zone_file in "$ZONE_DIR"/*.db; do # 从文件名提取域名(去掉.db后缀) domain=$(basename "$zone_file" .db) echo "正在处理区域文件: $zone_file (对应域名: $domain)" # 过滤掉注释、空行、SOA和NS记录,只处理目标记录类型 grep -vE "^#|^$|SOA|NS" "$zone_file" | while read -r line; do # 拆分记录字段,忽略BIND里的IN标识 parts=($line) # 处理BIND里的@(代表域名本身),转换成空字符串作为主机记录 hostname=${parts[0]} [ "$hostname" = "@" ] && hostname="" record_type=${parts[1]} # 根据记录类型生成对应命令 case "$record_type" in A) # A记录:提取IP地址,生成示例格式的命令 ip=${parts[2]} echo "/usr/bin/dns -a $domain -a \"$hostname\" -ip $ip" >> "$OUTPUT_FILE" ;; MX) # MX记录:提取优先级和邮件服务器地址,去掉BIND里的末尾点 priority=${parts[2]} target=${parts[3]%.} # 这里的MX命令格式是假设的,若新服务器参数不同,请自行调整 echo "/usr/bin/dns -a $domain -t MX -a \"$hostname\" -priority $priority -target $target" >> "$OUTPUT_FILE" ;; TXT) # TXT记录:提取完整文本内容(处理带空格的情况) text_content=$(echo "$line" | awk '{for(i=3; i<=NF; i++) print $i}' | xargs) # TXT命令格式同样根据新服务器实际情况调整 echo "/usr/bin/dns -a $domain -t TXT -a \"$hostname\" -text \"$text_content\"" >> "$OUTPUT_FILE" ;; *) # 跳过其他不需要的记录类型 continue ;; esac done done echo "处理完成!迁移命令已保存到 $OUTPUT_FILE"
使用步骤
- 修改配置:把脚本里的
ZONE_DIR改成你的BIND区域文件实际存放的目录;如果你的区域文件后缀不是.db,修改basename "$zone_file" .db里的.db为对应后缀(比如.zone)。 - 适配新服务器命令:如果新服务器的MX/TXT记录命令参数和脚本里假设的不一样(比如MX用
-mx而不是-t MX),直接修改case语句里的命令模板即可。 - 赋予执行权限:
chmod +x convert_dns_records.sh - 运行脚本:
./convert_dns_records.sh - 验证并执行:打开生成的
dns_migration_commands.sh,先检查几条命令确认格式正确,再传到新服务器批量执行。
注意事项
- 如果TXT记录里包含特殊字符(比如嵌套引号),可能需要手动调整脚本里的文本处理逻辑,确保内容正确转义。
- 如果你的区域文件名不是对应域名(比如用了数字编号),可以把提取域名的逻辑改成从SOA记录获取:
domain=$(grep -m1 "SOA" "$zone_file" | awk '{print $1}' | sed 's/@//'),不过需要确保SOA记录的格式规范。 - 建议先拿1-2个区域文件测试脚本,确认生成的命令没问题后,再批量处理700多个文件,避免出错。
内容的提问来源于stack exchange,提问作者user3716621




