昨天还是可以通过Webdav备份其他机器上的数据到飞牛的。只是昨天晚上的时候,我弄了一个脚本,就是把飞牛的IPv6地址更新到cloudflare的一个域名上了。但这个脚本是只在每天晚上才执行一次,用的是service.time的机制。原来这个timer上也是有一个定时执行的脚本是定时将其他机器备份过来的文件压缩成一个包,然后会从飞牛备份到阿里云,这个脚本已经运行了很长时间,只是昨天晚上加了一个同时将IPV6地址解析到cloudflare域名的动作。脚本我贴在下面:
#!/usr/bin/env bash
# -------------------------------------------
# Cloudflare DDNS over IPv6 for Debian
# usage: cf-ddns-ipv6.sh <完整域名>
# -------------------------------------------
set -euo pipefail
# ====== 用户配置 ======
TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # Cloudflare API Token
TTL=60
PROXY=false # 是否走 CF 代理
# =====================
DOMAIN="${1:-}" # 脚本参数:完整域名
[[ -z "$DOMAIN" ]] && { echo "用法: $0 <完整域名>"; exit 1; }
BASE_DOMAIN="${DOMAIN#*.}" # 例如 home.example.com -> example.com
# ---------- 获取本机全局 IPv6 ----------
get_ipv6() {
ip -6 addr show scope global \
| awk '/inet6/ {print $2}' \
| awk -F'/' '!($1 ~ /^(fe80|::1|fc00|fd00)/) {print $1; exit}'
}
IPV6="$(get_ipv6)"
[[ -z "$IPV6" ]] && { echo "未找到全局 IPv6"; exit 2; }
echo "当前 IPv6: $IPV6"
# ---------- Cloudflare API 通用函数 ----------
cf_api() {
local method="$1" path="$2" data="${3:-}"
curl -sS -X "$method" \
"https://api.cloudflare.com/client/v4$path" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
${data:+-d "$data"}
}
# ---------- 获取 zone_id ----------
ZONE_ID=$(cf_api GET "/zones" \
| jq -r --arg d "$BASE_DOMAIN" '.result[] | select(.name==$d) | .id')
[[ "$ZONE_ID" == "null" || -z "$ZONE_ID" ]] && { echo "找不到域名对应的 zone_id"; exit 3; }
# ---------- 查询已有记录 ----------
RECORD=$(cf_api GET "/zones/$ZONE_ID/dns_records?type=AAAA&name=$DOMAIN" \
| jq -r '.result[0] // empty')
# ---------- 构建 payload ----------
PAYLOAD=$(jq -n --arg ip "$IPV6" --arg ttl "$TTL" --arg proxied "$PROXY" \
'{
type: "AAAA",
name: "'"$DOMAIN"'",
content: $ip,
ttl: ($ttl | tonumber),
proxied: ($proxied | test("true"))
}')
# ---------- 创建或更新 ----------
if [[ -z "$RECORD" ]]; then
echo "首次创建 AAAA 记录 ..."
cf_api POST "/zones/$ZONE_ID/dns_records" "$PAYLOAD" | jq .
else
RECORD_ID=$(echo "$RECORD" | jq -r '.id')
echo "更新已有记录 ..."
cf_api PUT "/zones/$ZONE_ID/dns_records/$RECORD_ID" "$PAYLOAD" | jq .
fi