| 1 | #!/bin/sh |
| 2 | |
| 3 | # 配置变量 |
| 4 | ZONE='' |
| 5 | RECORD='' |
| 6 | EMAIL='' |
| 7 | TOKEN='' |
| 8 | MAX_RETRIES=5 # 最大重试次数 |
| 9 | RETRY_INTERVAL_MS=1500 # 重试间隔时间(毫秒) |
| 10 | SUCCESS_STRING='"success":true' # 接口调用成功时响应应包含的字符串 |
| 11 | |
| 12 | # 代理配置 |
| 13 | USE_PROXY=false # 是否使用代理 |
| 14 | PROXY_TYPE='' # 代理类型 ('http' 或 'socks5') |
| 15 | PROXY_URL='' # 代理 URL |
| 16 | PROXY_USER='' # 代理用户名(如果不需要认证则留空) |
| 17 | PROXY_PASS='' # 代理密码(如果不需要认证则留空) |
| 18 | |
| 19 | # 提取 IPv4 地址的各个八位段 |
| 20 | ip_oct1=$(echo "${ip}" | cut -d'.' -f1) |
| 21 | ip_oct2=$(echo "${ip}" | cut -d'.' -f2) |
| 22 | ip_oct3=$(echo "${ip}" | cut -d'.' -f3) |
| 23 | ip_oct4=$(echo "${ip}" | cut -d'.' -f4) |
| 24 | |
| 25 | # 计算 IP4P 地址的各个部分 |
| 26 | ip_hex_hi=$(printf '%02x%02x' "$ip_oct1" "$ip_oct2") |
| 27 | ip_hex_lo=$(printf '%02x%02x' "$ip_oct3" "$ip_oct4") |
| 28 | port_hex=$(printf '%04x' "${port}") |
| 29 | |
| 30 | # 构造 IP4P 地址 |
| 31 | ip4p="2001::${port_hex}:${ip_hex_hi}:${ip_hex_lo}" |
| 32 | echo "Generated IP4P Address: $ip4p" |
| 33 | |
| 34 | # 初始化重试计数器 |
| 35 | retry_count=0 |
| 36 | |
| 37 | # 根据 USE_PROXY 和 PROXY_TYPE 变量决定使用的代理选项 |
| 38 | if [ "$USE_PROXY" = true ]; then |
| 39 | auth="" |
| 40 | if [ -n "$PROXY_USER" ]; then |
| 41 | auth="$PROXY_USER" |
| 42 | fi |
| 43 | if [ -n "$PROXY_PASS" ]; then |
| 44 | if [ -n "$auth" ]; then |
| 45 | auth="$auth:$PROXY_PASS" |
| 46 | else |
| 47 | auth="$PROXY_PASS" |
| 48 | fi |
| 49 | fi |
| 50 | |
| 51 | case "$PROXY_TYPE" in |
| 52 | http) |
| 53 | proxy_option="--proxy http://$auth@$PROXY_URL" |
| 54 | ;; |
| 55 | socks5) |
| 56 | if [ -n "$auth" ]; then |
| 57 | proxy_option="--socks5 $PROXY_URL --proxy-user $auth" |
| 58 | else |
| 59 | proxy_option="--socks5 $PROXY_URL" |
| 60 | fi |
| 61 | ;; |
| 62 | *) |
| 63 | echo "Unsupported proxy type: $PROXY_TYPE" |
| 64 | exit 1 |
| 65 | ;; |
| 66 | esac |
| 67 | else |
| 68 | proxy_option="" |
| 69 | fi |
| 70 | |
| 71 | # 重试循环 |
| 72 | while true; do |
| 73 | # 发送请求并获取响应 |
| 74 | response=$(curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE}/dns_records/${RECORD}" \ |
| 75 | -H "X-Auth-Email: ${EMAIL}" \ |
| 76 | -H "Authorization: Bearer ${TOKEN}" \ |
| 77 | -H "Content-Type:application/json" \ |
| 78 | --data "{\"content\":\"${ip4p}\"}" $proxy_option) |
| 79 | |
| 80 | # 检查响应中是否包含成功字符串 |
| 81 | if echo "$response" | grep -q "$SUCCESS_STRING"; then |
| 82 | echo "Successfully updated DNS record." |
| 83 | break |
| 84 | else |
| 85 | echo "Failed to update DNS record. Response: $response" |
| 86 | retry_count=$((retry_count + 1)) |
| 87 | if [ "$retry_count" -ge "$MAX_RETRIES" ]; then |
| 88 | echo "Reached maximum retry limit. Exiting." |
| 89 | break |
| 90 | fi |
| 91 | echo "Retrying... ($retry_count/$MAX_RETRIES)" |
| 92 | sleep "$(echo "scale=3; $RETRY_INTERVAL_MS / 1000" | bc)" |
| 93 | fi |
| 94 | done |
GabrielxD / ip4p_cloudflare.sh
Last active 3 months ago
根据给定 IPv4 和端口生成 IP4P 格式并更新 Cloudflare AAAA 记录(用于 Lucky STUN 内网穿透脚本),关于 IP4P 格式详见:[NATMap - FAQ -域名访问是如何实现的?](https://github.com/heiher/natmap/wiki/faq#%E5%9F%9F%E5%90%8D%E8%AE%BF%E9%97%AE%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9A%84)