项目地址

更新 DNS 解析记录

用于更新 DNS 解析记录的 Shell 脚本,支持 Cloudflare 和 DNSPod,尽可能减少凭据的需要。

支持平台

DNSPod

DNSPod 需要获取 ID 和 Key。

- 获取 ID 和 Key 文档

Cloudflare

Cloudflare 只需要获取一个 Token 即可,确保 Token 具有相应区域的 DNS 编辑权限。

- 获取 Token 文档

安装 jq

Shell 脚本适用于绝大多数 Linux 发行版,只需要确保拥有 jq 即可。

Debian/Ubuntu
sudo apt update && sudo apt install jq
CentOS/RHEL
sudo yum install epel-release && sudo yum install jq
OpenWrt
opkg update && opkg install jq

dnspod_update_dns.sh

#!/bin/bash
# 先决条件

# 1.获取id与key
# 获取id与key文档:https://docs.dnspod.cn/account/dnspod-token/

# 2.安装jq
# Debian/Ubuntu:sudo apt update && sudo apt install jq
# CentOS/RHEL:sudo yum install epel-release && sudo yum install jq
# OpenWrt:opkg update && opkg install jq

# 检查参数
if [ "$#" -ne 4 ]; then
    echo "使用方法: $0 <域名> <子域名> <记录类型> <新值>"
    echo "示例: $0 388488.xyz hello A 2.2.2.2"
    exit 1
fi

# 配置API Token信息
DP_Id="40xxxx"
DP_Key="7xxx101fa77xxxxxxxxxxxxxxxx"

# 从参数获取域名信息
DOMAIN="$1"
SUB_DOMAIN="$2"
RECORD_TYPE="$3"
NEW_VALUE="$4"

# 组合Token ID和Token Key
API_TOKEN="${DP_Id},${DP_Key}"

# API地址
API_LIST_URL="https://dnsapi.cn/Record.List"
API_CREATE_URL="https://dnsapi.cn/Record.Create"
API_MODIFY_URL="https://dnsapi.cn/Record.Modify"

# 获取记录ID
response=$(curl -s -X POST $API_LIST_URL \
  -d "login_token=${API_TOKEN}" \
  -d "format=json" \
  -d "domain=${DOMAIN}" \
  -d "sub_domain=${SUB_DOMAIN}")

RECORD_ID=$(echo $response | jq -r ".records[] | select(.type == \"$RECORD_TYPE\") | .id")

# 如果记录不存在则创建新的记录
if [ -z "$RECORD_ID" ] || [ "$RECORD_ID" == "null" ]; then
  echo "DNS 记录不存在,创建新的记录..."
  response=$(curl -s -X POST $API_CREATE_URL \
    -d "login_token=${API_TOKEN}" \
    -d "format=json" \
    -d "domain=${DOMAIN}" \
    -d "sub_domain=${SUB_DOMAIN}" \
    -d "record_type=${RECORD_TYPE}" \
    -d "record_line=默认" \
    -d "value=${NEW_VALUE}")
else
  echo "DNS 记录存在,更新记录..."
  response=$(curl -s -X POST $API_MODIFY_URL \
    -d "login_token=${API_TOKEN}" \
    -d "format=json" \
    -d "domain=${DOMAIN}" \
    -d "sub_domain=${SUB_DOMAIN}" \
    -d "record_id=${RECORD_ID}" \
    -d "record_type=${RECORD_TYPE}" \
    -d "record_line=默认" \
    -d "value=${NEW_VALUE}")
fi

# 检查操作是否成功
if echo "$response" | grep -q "\"code\":\"1\""; then
    echo "DNS 记录操作成功。"
else
    echo "DNS 记录操作失败。"
    echo "响应: $response"
fi

cloudflare_update_dns.sh

#!/bin/bash
# 先决条件

# 1.获取token
# 获取token文档:https://blog.cloudflare.com/zh-cn/api-tokens-general-availability-zh-cn

# 2.安装jq
# Debian/Ubuntu:sudo apt update && sudo apt install jq
# CentOS/RHEL:sudo yum install epel-release && sudo yum install jq
# OpenWrt:opkg update && opkg install jq

# 检查参数
if [ "$#" -ne 4 ]; then
    echo "使用方法: $0 <域名> <子域名> <记录类型> <新值>"
    echo "示例: $0 388488.xyz hello A 2.2.2.2"
    exit 1
fi

# 配置token
CF_API_TOKEN="vMS0Jxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

DOMAIN=$1
SUBDOMAIN=$2
RECORD_TYPE=$3
NEW_VALUE=$4

# 获取 Zone ID
zone_response=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$DOMAIN" \
     -H "Authorization: Bearer $CF_API_TOKEN" \
     -H "Content-Type: application/json")

ZONE_ID=$(echo $zone_response | jq -r '.result[0].id')

if [ -z "$ZONE_ID" ]; then
    echo "获取域名 Zone ID 失败: $DOMAIN,请检查你的token区域权限"
    exit 1
fi

# 获取 DNS 记录 ID
record_response=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$SUBDOMAIN.$DOMAIN" \
     -H "Authorization: Bearer $CF_API_TOKEN" \
     -H "Content-Type: application/json")

RECORD_ID=$(echo $record_response | jq -r '.result[0].id')

# 如果记录不存在则创建新的记录
if [ -z "$RECORD_ID" ] || [ "$RECORD_ID" == "null" ]; then
    echo "DNS 记录不存在,创建新的记录..."
    response=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \
         -H "Authorization: Bearer $CF_API_TOKEN" \
         -H "Content-Type: application/json" \
         --data '{
           "type": "'"$RECORD_TYPE"'",
           "name": "'"$SUBDOMAIN.$DOMAIN"'",
           "content": "'"$NEW_VALUE"'",
           "ttl": 600,
           "proxied": false
         }')
else
    echo "DNS 记录存在,更新记录..."
    response=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
         -H "Authorization: Bearer $CF_API_TOKEN" \
         -H "Content-Type: application/json" \
         --data '{
           "type": "'"$RECORD_TYPE"'",
           "name": "'"$SUBDOMAIN.$DOMAIN"'",
           "content": "'"$NEW_VALUE"'",
           "ttl": 600,
           "proxied": false
         }')
fi

# 检查操作是否成功
if echo "$response" | grep -q '"success":true'; then
    echo "DNS 记录操作成功。"
else
    echo "DNS 记录操作失败。"
    echo "响应: $response"
fi

文章作者: 子受
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 薪萤-博客
技术
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝