如何编写批量修改域名解析记录

wen 实用脚本 26

本文目录导读:

如何编写批量修改域名解析记录

  1. 方法一:使用DNS服务商API(推荐,适用于云服务商)
  2. 方法二:使用nsupdate(适用于BIND/DNS服务器)
  3. 方法三:使用CSV批量导入(适用于Web控制台)
  4. 方法四:通用脚本框架(支持多种服务商)
  5. 常见注意事项
  6. 自动化建议

编写批量修改域名解析记录的脚本,通常需要调用DNS服务商提供的API(如阿里云、腾讯云、Cloudflare、AWS Route53等)或使用系统工具(如nsupdate),以下是几种常见场景的解决方案:

使用DNS服务商API(推荐,适用于云服务商)

大多数主流DNS服务商都提供API,可以批量查询、修改、删除记录。

示例:使用阿里云DNS API(Python)

import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest, UpdateDomainRecordRequest
# 配置你的 AccessKey
client = AcsClient('your-access-key-id', 'your-access-key-secret', 'cn-hangzhou')
def get_all_records(domain):
    request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
    request.set_DomainName(domain)
    request.set_PageSize(500)  # 每次最多500条
    records = []
    page = 1
    while True:
        request.set_PageNumber(page)
        response = client.do_action_with_exception(request)
        result = json.loads(response)
        records.extend(result['DomainRecords']['Record'])
        if result['TotalCount'] <= page * 500:
            break
        page += 1
    return records
def update_record(record_id, rr, type, value, ttl=600):
    request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
    request.set_RecordId(record_id)
    request.set_RR(rr)
    request.set_Type(type)
    request.set_Value(value)
    request.set_TTL(ttl)
    response = client.do_action_with_exception(request)
    return json.loads(response)
# 批量修改:将所有A记录指向新IP
domain = "example.com"
new_ip = "1.2.3.4"
records = get_all_records(domain)
for rec in records:
    if rec['Type'] == 'A':  # 只修改A记录
        print(f"Updating {rec['RR']}.{domain} from {rec['Value']} to {new_ip}")
        update_record(rec['RecordId'], rec['RR'], 'A', new_ip)

其他云服务商API示例:

  • 腾讯云DNSPod:使用tencentcloud-sdk-pythondnspod模块
  • Cloudflare:使用cloudflare Python库(REST API)
  • AWS Route53:使用boto3库的route53客户端

使用nsupdate(适用于BIND/DNS服务器)

如果你管理自己的DNS服务器(如BIND),可以使用nsupdate命令批量修改。

#!/bin/bash
# 批量修改example.com所有A记录为1.2.3.4
SERVER="ns1.example.com"
ZONE="example.com"
# 生成nsupdate命令文件
cat > update.txt << EOF
server $SERVER
zone $ZONE
update delete *.example.com A
update add *.example.com 3600 A 1.2.3.4
send
EOF
# 执行
nsupdate -k /path/to/private.key update.txt

使用CSV批量导入(适用于Web控制台)

大多数DNS服务商都支持从CSV文件导入记录

  1. 将当前记录导出为CSV
  2. 修改CSV中的值
  3. 删除现有记录
  4. 导入修改后的CSV

通用脚本框架(支持多种服务商)

可以编写一个支持多服务商的脚本,

import argparse
import configparser
def batch_update(provider, domain, old_value, new_value, record_type='A'):
    if provider == 'aliyun':
        # 调用阿里云API
        pass
    elif provider == 'tencent':
        # 调用腾讯云API
        pass
    elif provider == 'cloudflare':
        # 调用Cloudflare API
        pass
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--provider', required=True)
    parser.add_argument('--domain', required=True)
    parser.add_argument('--old-value')
    parser.add_argument('--new-value', required=True)
    parser.add_argument('--type', default='A')
    args = parser.parse_args()
    batch_update(args.provider, args.domain, args.old_value, args.new_value, args.type)

常见注意事项

  1. 权限保护:API密钥不要硬编码在脚本中,建议使用环境变量或配置文件
  2. 限流控制:大多数API有速率限制,批量操作时需加入适当的延迟
  3. 事务处理:如果要修改大量记录,建议先测试,或者使用“先删除后添加”的方式(注意检查是否会产生TXT验证失败等问题)
  4. TTL设置:修改前降低TTL可以加速DNS生效
  5. 备份记录:修改前务必导出当前记录作为备份

自动化建议

  • 使用Terraform:如果需要基础设施即代码,Terraform支持多种DNS提供商
  • 使用GitHub Actions/Azure DevOps:配合CI/CD管道定时或触发批量修改

根据你的具体需求(云服务商、记录数量、修改复杂度),选择最适合的方案即可,如果提供更具体的场景(如要修改2000条A记录,从旧IP改为新IP),我可以给出更针对性的代码。

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