You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

编写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"

使用步骤

  1. 修改配置:把脚本里的ZONE_DIR改成你的BIND区域文件实际存放的目录;如果你的区域文件后缀不是.db,修改basename "$zone_file" .db里的.db为对应后缀(比如.zone)。
  2. 适配新服务器命令:如果新服务器的MX/TXT记录命令参数和脚本里假设的不一样(比如MX用-mx而不是-t MX),直接修改case语句里的命令模板即可。
  3. 赋予执行权限chmod +x convert_dns_records.sh
  4. 运行脚本./convert_dns_records.sh
  5. 验证并执行:打开生成的dns_migration_commands.sh,先检查几条命令确认格式正确,再传到新服务器批量执行。

注意事项

  • 如果TXT记录里包含特殊字符(比如嵌套引号),可能需要手动调整脚本里的文本处理逻辑,确保内容正确转义。
  • 如果你的区域文件名不是对应域名(比如用了数字编号),可以把提取域名的逻辑改成从SOA记录获取:domain=$(grep -m1 "SOA" "$zone_file" | awk '{print $1}' | sed 's/@//'),不过需要确保SOA记录的格式规范。
  • 建议先拿1-2个区域文件测试脚本,确认生成的命令没问题后,再批量处理700多个文件,避免出错。

内容的提问来源于stack exchange,提问作者user3716621

火山引擎 最新活动