本文目录导读:

- 方法一:使用DNS服务商API(推荐,适用于云服务商)
- 方法二:使用nsupdate(适用于BIND/DNS服务器)
- 方法三:使用CSV批量导入(适用于Web控制台)
- 方法四:通用脚本框架(支持多种服务商)
- 常见注意事项
- 自动化建议
编写批量修改域名解析记录的脚本,通常需要调用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-python的dnspod模块 - Cloudflare:使用
cloudflarePython库(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文件导入记录:
- 将当前记录导出为CSV
- 修改CSV中的值
- 删除现有记录
- 导入修改后的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)
常见注意事项
- 权限保护:API密钥不要硬编码在脚本中,建议使用环境变量或配置文件
- 限流控制:大多数API有速率限制,批量操作时需加入适当的延迟
- 事务处理:如果要修改大量记录,建议先测试,或者使用“先删除后添加”的方式(注意检查是否会产生TXT验证失败等问题)
- TTL设置:修改前降低TTL可以加速DNS生效
- 备份记录:修改前务必导出当前记录作为备份
自动化建议
- 使用Terraform:如果需要基础设施即代码,Terraform支持多种DNS提供商
- 使用GitHub Actions/Azure DevOps:配合CI/CD管道定时或触发批量修改
根据你的具体需求(云服务商、记录数量、修改复杂度),选择最适合的方案即可,如果提供更具体的场景(如要修改2000条A记录,从旧IP改为新IP),我可以给出更针对性的代码。