如何用脚本批量添加DNS记录?

wen 实用脚本 3

本文目录导读:

如何用脚本批量添加DNS记录?

  1. 使用Cloudflare API (Python脚本)
  2. 从CSV文件读取批量添加
  3. 使用Bash脚本 (cURL + Cloudflare API)
  4. 使用阿里云DNS API (Python)
  5. 使用dnspython库 (通用)
  6. 安装依赖
  7. 使用建议

我来介绍几种批量添加DNS记录的方法:

使用Cloudflare API (Python脚本)

#!/usr/bin/env python3
import os
import requests
import json
from typing import List, Dict
# 配置
CLOUDFLARE_EMAIL = "your_email@example.com"
CLOUDFLARE_API_KEY = "your_api_key"
ZONE_ID = "your_zone_id"
DOMAIN = "yourdomain.com"
headers = {
    "X-Auth-Email": CLOUDFLARE_EMAIL,
    "X-Auth-Key": CLOUDFLARE_API_KEY,
    "Content-Type": "application/json"
}
def add_dns_record(record_type: str, name: str, content: str, ttl: int = 120, proxied: bool = False):
    """添加单个DNS记录"""
    url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records"
    data = {
        "type": record_type,
        "name": name,
        "content": content,
        "ttl": ttl,
        "proxied": proxied
    }
    response = requests.post(url, headers=headers, json=data)
    if response.status_code == 200:
        print(f"✓ 添加成功: {name}.{DOMAIN} -> {content}")
        return True
    else:
        print(f"✗ 添加失败: {name}.{DOMAIN} - {response.json()['errors']}")
        return False
def batch_add_records(records: List[Dict]):
    """批量添加DNS记录"""
    success_count = 0
    fail_count = 0
    for record in records:
        if add_dns_record(**record):
            success_count += 1
        else:
            fail_count += 1
    print(f"\n批量添加完成: 成功 {success_count}, 失败 {fail_count}")
# 示例数据 - 从CSV文件或数组读取
records_to_add = [
    {"record_type": "A", "name": "www", "content": "1.2.3.4", "ttl": 120},
    {"record_type": "A", "name": "api", "content": "1.2.3.5", "ttl": 120},
    {"record_type": "CNAME", "name": "blog", "content": "blog.example.com", "ttl": 300},
    {"record_type": "MX", "name": "@", "content": "mail.example.com", "ttl": 300},
    {"record_type": "TXT", "name": "@", "content": "v=spf1 include:_spf.example.com ~all", "ttl": 300}
]
if __name__ == "__main__":
    batch_add_records(records_to_add)

从CSV文件读取批量添加

#!/usr/bin/env python3
import csv
import requests
def import_from_csv(csv_file: str):
    """从CSV文件导入DNS记录"""
    with open(csv_file, 'r', encoding='utf-8') as file:
        reader = csv.DictReader(file)
        records = list(reader)
    batch_add_records(records)
# CSV文件格式示例 (dns_records.csv):
# type,name,content,ttl,proxied
# A,www,1.2.3.4,120,false
# CNAME,blog,blog.example.com,300,false
# MX,@,mail.example.com,300,false
if __name__ == "__main__":
    import_from_csv("dns_records.csv")

使用Bash脚本 (cURL + Cloudflare API)

#!/bin/bash
# 配置
CLOUDFLARE_EMAIL="your_email@example.com"
CLOUDFLARE_API_KEY="your_api_key"
ZONE_ID="your_zone_id"
DOMAIN="yourdomain.com"
# 批量添加函数
add_dns_record() {
    local TYPE=$1
    local NAME=$2
    local CONTENT=$3
    local TTL=${4:-120}
    local PROXIED=${5:-false}
    curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \
        -H "X-Auth-Email: $CLOUDFLARE_EMAIL" \
        -H "X-Auth-Key: $CLOUDFLARE_API_KEY" \
        -H "Content-Type: application/json" \
        --data "{
            \"type\": \"$TYPE\",
            \"name\": \"$NAME\",
            \"content\": \"$CONTENT\",
            \"ttl\": $TTL,
            \"proxied\": $PROXIED
        }"
    echo "添加记录: $NAME.$DOMAIN -> $CONTENT"
}
# 从文件读取记录并批量添加
while IFS=',' read -r TYPE NAME CONTENT TTL PROXIED; do
    # 跳过标题行
    if [ "$TYPE" != "type" ]; then
        add_dns_record "$TYPE" "$NAME" "$CONTENT" "$TTL" "$PROXIED"
    fi
done < "dns_records.csv"

使用阿里云DNS API (Python)

#!/usr/bin/env python3
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109 import AddDomainRecordRequest
import json
# 配置阿里云
ACCESS_KEY_ID = "your_access_key_id"
ACCESS_KEY_SECRET = "your_access_key_secret"
DOMAIN = "yourdomain.com"
client = AcsClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET, 'cn-hangzhou')
def add_aliyun_dns_record(record_type: str, rr: str, value: str, ttl: int = 600):
    """添加阿里云DNS记录"""
    request = AddDomainRecordRequest.AddDomainRecordRequest()
    request.set_DomainName(DOMAIN)
    request.set_Type(record_type)
    request.set_RR(rr)
    request.set_Value(value)
    request.set_TTL(ttl)
    try:
        response = client.do_action_with_exception(request)
        result = json.loads(response)
        print(f"✓ 添加成功: {rr}.{DOMAIN} -> {value}")
        return True
    except Exception as e:
        print(f"✗ 添加失败: {rr}.{DOMAIN} - {e}")
        return False
# 批量添加
records = [
    ("A", "www", "1.2.3.4"),
    ("A", "api", "1.2.3.5"),
    ("CNAME", "blog", "blog.example.com")
]
for record_type, rr, value in records:
    add_aliyun_dns_record(record_type, rr, value)

使用dnspython库 (通用)

#!/usr/bin/env python3
import dns.resolver
import dns.update
import dns.query
import dns.tsigkeyring
# 配置DNS服务器
DNS_SERVER = "ns1.yourdomain.com"
ZONE = "yourdomain.com"
KEY_NAME = "your-key-name"
KEY_SECRET = "your-key-secret"
# 创建TSIG密钥
keyring = dns.tsigkeyring.from_text({
    KEY_NAME: KEY_SECRET
})
def add_record_via_nsupdate(record_type: str, name: str, content: str, ttl: int = 300):
    """使用nsupdate方式添加记录"""
    update = dns.update.Update(ZONE, keyring=keyring)
    if record_type == "A":
        update.add(name, ttl, 'A', content)
    elif record_type == "CNAME":
        update.add(name, ttl, 'CNAME', content)
    elif record_type == "MX":
        update.add(name, ttl, 'MX', content)
    elif record_type == "TXT":
        update.add(name, ttl, 'TXT', content)
    response = dns.query.tcp(update, DNS_SERVER)
    if response.rcode() == 0:
        print(f"✓ 添加成功: {name}.{ZONE} -> {content}")
        return True
    else:
        print(f"✗ 添加失败: {name}.{ZONE}")
        return False
# 批量添加
records = [
    ("A", "www", "1.2.3.4"),
    ("A", "api", "1.2.3.5"),
    ("CNAME", "blog", "blog.example.com")
]
for record_type, name, content in records:
    add_record_via_nsupdate(record_type, name, content)

安装依赖

# Cloudflare API
pip install requests
# 阿里云SDK
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-alidns
# dnspython
pip install dnspython

使用建议

  1. 记录格式建议:使用CSV文件管理记录,便于维护
  2. 错误处理:添加重试机制和日志记录
  3. 验证结果:添加后执行DNS查询验证
  4. 速率限制:注意API调用限制,添加延时
  5. 备份:批量操作前备份原有DNS记录

选择哪种方式取决于你的域名注册商和DNS提供商,Cloudflare和阿里云提供了最完善的API支持。

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