首页/分享/文章阅读

阿里云ddns一键脚本完全版本

分享 2025-06-14 37 0

之前找了个国内将国内动态IP定时同步到阿里云DDNS的脚本,但是在实际使用过程中不是很好用。

这次加了个判断,由于我的检测频率过高,本地缓存一次IP地址进行判断,若是IP已经变化,则请求域名解析接口,若没有,则结束脚本。

启发来自于Cloudflare的ddns脚本,我发现这样做更好一些,起码不会频繁请求接口。

脚本:

#!/bin/bash
set -e

#================================================================================================================#

功能:用于更新阿里云域名IP,实现DDNS功能

#

https://www.gebi1.com/forum.php?mod=viewthread&tid=287344&page=1&_dsign=8f94f74c 提供的脚本文件基础上修改的.

ghui, modified 12/2/2019

在 N1 debian Buster with Armbian Linux 5.3.0-aml-g12 手动执行/定时任务(crontab)执行测试通过

融合了Cloudflare DDNS脚本中IP未改变则不提交更新的功能

#================================================================================================================# #

使用方法:

#

方法1. 外部参数

修改源码,将对应参数 修改为\(1,\)2,\(3,\)4,\(5,\)6

aliddns.sh <aliddns_ak> <aliddns_sk> <aliddns_subdomain> <aliddns_domain> <aliddns_iptype> <aliddns_ttl>

示例(A 代表 IPv4,AAAA 代表 IPv6):

执行:aliddns.sh “xxxx” “xxx” “test” “mydomain.site” “A” 600

执行:aliddns.sh “xxxx” “xxx” “test” “mydomain.site” “AAAA” 600

#

方法2. 内部参数

修改源码,将\(1,\)2,\(3,\)4,\(5,\)6 替换为对应参数

示例:

aliddns_ak=“xxxx”

aliddns_sk=“xxx”

aliddns_subdomain=“test”

aliddns_domain=“mydomain.site”

aliddns_iptype=“A”

aliddns_ttl=600

执行:aliddns.sh

# #================================================================================================================#

#————————————————————–

参数

#

(*)阿里云 AccessKeyId

aliddns_ak=“你的AccessKeyId”

(*)阿里云 AccessKeySecret

aliddns_sk=“你的AccessKeySecret”

(*)域名:test.mydomain.com

aliddns_subdomain=“test” #‘只需填写前缀二级’ aliddns_domain=“ip.cn” #‘mydomain.com’

(*)ip地址类型:’A’ 或 ‘AAAA’,代表ipv4 和 ipv6

aliddns_iptype=“A” # ‘A’ 或 ‘AAAA’,代表ipv4 和 ipv6

TTL 默认10分钟 = 600秒

aliddns_ttl=600 #“600”

是否强制更新,即使IP未改变

FORCE=false

存储上次IP的文件路径

WAN_IP_FILE=”\(HOME/.aliddns-wan_ip_\){aliddnssubdomain}\({aliddns_domain}_\){aliddns_iptype}.txt”

#————————————————————–

machine_ip=“” ddns_ip=“” aliddns_record_id=“”

if [ “\(aliddns_subdomain" = "@" ]; then aliddns_name=\)aliddns_domain else aliddns_name=”\(aliddns_subdomain.\)aliddns_domain” fi

now=\((date) echo "**************************************************" echo "\)now” echo “$aliddns_name”

这里接口用的ipw.cn,ipv6的对应地址为https://6.ipw.cn

function getMachine_IPv4() { echo $(/usr/bin/wget -qO- -t1 -T2 https://4.ipw.cn) }

function getMachine_IPv6() { ipv6=\((ip addr | grep "inet6.*global" | grep -v "deprecated" | awk '{print \)2}’ | awk -F”/” ‘{print \(1}' | sed -n '1,1p') echo \)ipv6 }

function getDDNS_IP() { current_ip=\((nslookup -query=\)aliddns_iptype \(aliddns_name | grep "Address" | grep -v "#53" | awk '{print \)2}’) echo $current_ip }

function urlencode() { # urlencode <string> out=“” while read -n1 c; do case \(c in [a-zA-Z0-9._-]) out="\)out\(c" ;; *) out="\)out\((printf '%%%02X' "'\)c”)” ;; esac done echo -n $out }

function enc() { echo -n “$1” | urlencode }

function send_request() { local args=“AccessKeyId=\(aliddns_ak&Action=\)1&Format=json&\(2&Version=2015-01-09" local hash=\)(echo -n “GET&%2F&\((enc "\)args”)” | openssl dgst -sha1 -hmac “\(aliddns_sk&" -binary | openssl base64) curl -s "https://alidns.aliyuncs.com/?\)args&Signature=\((enc "\)hash”)” }

function get_recordid() { grep -Eo ‘“RecordId”:“[0-9]+”’ | cut -d’:’ -f2 | tr -d ‘“’ }

function query_recordid() { send_request “DescribeSubDomainRecords” “SignatureMethod=HMAC-SHA1&SignatureNonce=\(timestamp&SignatureVersion=1.0&SubDomain=\)aliddns_name&Timestamp=\(timestamp&Type=\)aliddns_iptype” }

function update_record() { send_request “UpdateDomainRecord” “RR=\(aliddns_subdomain&RecordId=\)1&SignatureMethod=HMAC-SHA1&SignatureNonce=\(timestamp&SignatureVersion=1.0&TTL=\)aliddns_ttl&Timestamp=\(timestamp&Type=\)aliddns_iptype&Value=\((enc \)machine_ip)” }

function add_record() { send_request “AddDomainRecord&DomainName=\(aliddns_domain" "RR=\)aliddns_subdomain&SignatureMethod=HMAC-SHA1&SignatureNonce=\(timestamp&SignatureVersion=1.0&TTL=\)aliddns_ttl&Timestamp=\(timestamp&Type=\)aliddns_iptype&Value=\((enc \)machine_ip)” }

获取当前机器IP

if [ “\(aliddns_iptype" = 'A' ]; then echo "ddns is IPv4." machine_ip=\)(getMachine_IPv4) echo “machine_ip = \(machine_ip" aliddns_record_id=\)aliddnsipv4_record_id else echo “ddns is IPv6.” machine_ip=\((getMachine_IPv6) echo "machine_ip = \)machine_ip” aliddns_record_id=$aliddnsipv6_record_id fi

检查是否获取到IP

if [ -z “$machine_ip” ]; then echo “machine_ip is empty!” exit 0 fi

获取DDNS当前解析的IP

ddns_ip=\((getDDNS_IP) echo "ddns_ip = \)ddns_ip”

获取上次记录的IP

if [ -f \(WAN_IP_FILE ]; then OLD_WAN_IP=\)(cat $WAN_IP_FILE) else OLD_WAN_IP=“” fi

如果IP未改变且不强制更新,则退出

if [ “\(machine_ip" = "\)OLD_WAN_IP” ] && [ “$FORCE” = false ]; then echo “IP Unchanged, to update anyway use flag -f true” exit 0 fi

如果DNS记录IP与当前IP相同,则退出

if [ “\(machine_ip" = "\)ddns_ip” ]; then echo “DNS record already up to date” exit 1 fi

echo “start update…”

timestamp=$(date -u “+%Y-%m-%dT%H%%3A%M%%3A%SZ”)

if [ -z “\(aliddns_record_id" ]; then aliddns_record_id=\)(query_recordid | get_recordid) echo “—————- $aliddns_record_id”

if [ "$aliddns_iptype" = 'A' ]; then
    aliddnsipv4_record_id=$aliddns_record_id
else
    aliddnsipv6_record_id=$aliddns_record_id
fi

fi

Add support */%2A and @/%40 record

if [ -z “\(aliddns_record_id" ]; then echo "add record starting" aliddns_record_id=\)(add_record | get_recordid)

if [ -z "$aliddns_record_id" ]; then
    echo "aliddns_record_id is empty."
else
    if [ "$aliddns_iptype" = 'A' ]; then
        aliddnsipv4_record_id=$aliddns_record_id
    else
        aliddnsipv6_record_id=$aliddns_record_id
    fi
    echo "added record $aliddns_record_id"
    # 保存当前IP到文件
    echo $machine_ip > $WAN_IP_FILE
fi

else echo “update record starting” update_record \(aliddns_record_id echo "updated record \)aliddns_record_id” # 保存当前IP到文件 echo \(machine_ip > \)WAN_IP_FILE fi

正文结束

阿里云&腾讯云轻量服务器可用地区Looking Glass地址玩alpine遇到的问题以及解决方法

评论区

还没有评论,来坐沙发吧。