ShellScript:Cloudflare API v4 動態更新 IP 實現 DDNS 功能

文章參考來源:利用 Cloudflare API v4 建立 DDNS – 桓桓鄉寇 (huanyichuang.com)
主要補充了 Record ID 直接透過指令過濾出來,連貫運行接下來的 IP 修改
作法同樣是抓出該域名下所有 DNS 紀錄,再針對要修改的域名 ,利用 jq 取得 Record ID
jq 需事先安裝好,用法可以參考這邊:Shell:jq 循环 json 对象, jq 循环 json 数组

執行前 lab 指向 1.2.3.4
#!/bin/sh
GLOBAL_API_KEY=YOUR_GLOBAL_API_KEY
API_TOKEN=YOUR_API_TOKEN
EMAIL=YOUR_EMAIL
DOMAIN=$1
ZONE_ID=YOUR_ZONE_ID
# 這邊會把需要修改的 domain name 篩出來
RECORD_ID=$(curl -sSX GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" -H "X-Auth-Email:$EMAIL" -H "X-Auth-Key:$GLOBAL_API_KEY" -H "Content-Type: application/json" | jq --arg DOMAIN $DOMAIN '.result | .[] | select(.name == $DOMAIN) |.id' | sed 's|"||g')

NEW_IP=$(curl -sS ip.me)
OLD_IP=$(cat old_ip.txt)

if [ "$NEW_IP" != "$OLD_IP" ]; then
  curl -sSX PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"type":"A","name":"'"$DOMAIN"'","content":"'"$NEW_IP"'","ttl":60,"proxied":false}' > /dev/null
  echo "$NEW_IP" > old_ip.txt
  echo "$OLD_IP IP change to $NEW_IP"
else
  echo "$NEW_IP IP no changed"
fi

最後運行要修改的 domain name

sh ddns.sh lab.cwlove.idv.tw
執行後 IP 指向新的

配合排程就可以設定多個域名更新