一、安装依赖
在执行脚本之前,需要确保你的OpenWrt设备已安装了curl和jq两个软件包。
运行以下命令,安装缺失的软件包:
opkg update opkg install curl opkg install jq
二、阿里云获取Access Key
在运行脚本时需要使用阿里云的Access Key,获取方法如下:
- 登录阿里云控制台,在AccessKey管理页面创建一个AccessKey。
- 记录AccessKey ID和Access Key Secret,后续需要在脚本中使用。
三、创建OpenWrt阿里云DDNS脚本
在OpenWrt设备上,创建一个名为aliyun-ddns.sh的文件,并在文件中粘贴以下脚本:
#!/bin/sh ACCESS_KEY_ID="YourAccessKeyId" #阿里云Access Key ID ACCESS_KEY_SECRET="YourAccessKeySecret" #阿里云Access Key Secret DOMAIN_NAME="YourDomainName" #域名名称,例如"example.com" SUB_DOMAIN="YourSubDomain" #子域名名称,例如"www" RECORD_TYPE="A" #记录类型,例如"A"、"CNAME"等 RECORD_LINE="default" #记录行,例如"default" TTL="600" #TTL,例如"600",单位为秒 #获取当前的IP地址 IP=`curl -s https://api.ipify.org` #获取解析记录ID RECORD_ID=`curl -s -X POST https://alidns.aliyuncs.com/ -d "AccessKeyId=$ACCESS_KEY_ID&Action=DescribeDomainRecords&DomainName=$DOMAIN_NAME&Format=json&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Version=2015-01-09&Signature=$(/usr/bin/printf $(/bin/echo -n "POST&`/usr/bin/printf "/&/" | /usr/bin/xxd -c 256 -ps`&`/usr/bin/printf "AccessKeyId=$ACCESS_KEY_ID&Action=DescribeDomainRecords&DomainName=$DOMAIN_NAME&Format=json&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Version=2015-01-09" | /usr/bin/iconv -f utf8 -t iso88591 | /usr/bin/openssl dgst -sha1 -binary -hmac "$ACCESS_KEY_SECRET&" | /usr/bin/base64))"` #解析记录不存在,添加一条解析记录 if [ `echo $RECORD_ID | jq '.TotalCount'` -eq 0 ] then RESPONSE=`curl -s -X POST https://alidns.aliyuncs.com/ -d "AccessKeyId=$ACCESS_KEY_ID&Action=AddDomainRecord&DomainName=$DOMAIN_NAME&Format=json&RR=$SUB_DOMAIN&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Type=$RECORD_TYPE&Value=$IP&Line=$RECORD_LINE&TTL=$TTL&Version=2015-01-09&Signature=$(/usr/bin/printf $(/bin/echo -n "POST&`/usr/bin/printf "/&/" | /usr/bin/xxd -c 256 -ps`&`/usr/bin/printf "AccessKeyId=$ACCESS_KEY_ID&Action=AddDomainRecord&DomainName=$DOMAIN_NAME&Format=json&RR=$SUB_DOMAIN&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Type=$RECORD_TYPE&Value=$IP&Line=$RECORD_LINE&TTL=$TTL&Version=2015-01-09" | /usr/bin/iconv -f utf8 -t iso88591 | /usr/bin/openssl dgst -sha1 -binary -hmac "$ACCESS_KEY_SECRET&" | /usr/bin/base64))"` else #解析记录已存在,更新解析记录的IP地址 RECORD=`echo $RECORD_ID | jq ".DomainRecords.Record | map(select(.RR == \"$SUB_DOMAIN\" and .Type == \"$RECORD_TYPE\"))[0]"` RECORD_ID=`echo $RECORD | jq -r '.RecordId'` RECORD_IP=`echo $RECORD | jq -r '.Value'` if [ "$RECORD_IP" != "$IP" ] then RESPONSE=`curl -s -X POST https://alidns.aliyuncs.com/ -d "AccessKeyId=$ACCESS_KEY_ID&Action=UpdateDomainRecord&DomainName=$DOMAIN_NAME&Format=json&RecordId=$RECORD_ID&RR=$SUB_DOMAIN&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Type=$RECORD_TYPE&Value=$IP&Line=$RECORD_LINE&TTL=$TTL&Version=2015-01-09&Signature=$(/usr/bin/printf $(/bin/echo -n "POST&`/usr/bin/printf "/&/" | /usr/bin/xxd -c 256 -ps`&`/usr/bin/printf "AccessKeyId=$ACCESS_KEY_ID&Action=UpdateDomainRecord&DomainName=$DOMAIN_NAME&Format=json&RecordId=$RECORD_ID&RR=$SUB_DOMAIN&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Type=$RECORD_TYPE&Value=$IP&Line=$RECORD_LINE&TTL=$TTL&Version=2015-01-09" | /usr/bin/iconv -f utf8 -t iso88591 | /usr/bin/openssl dgst -sha1 -binary -hmac "$ACCESS_KEY_SECRET&" | /usr/bin/base64))"` fi fi
四、设置定时任务
将刚才创建的脚本设置为定时任务,每隔一段时间执行一次,更新解析记录的IP地址。
在OpenWrt设备上,执行以下命令打开定时任务编辑器:
crontab -e
在编辑器中添加以下一行,设置定时任务每隔10分钟执行一次:
*/10 * * * * /bin/sh /root/aliyun-ddns.sh
五、运行脚本
在命令行中运行以下命令,手动测试脚本是否正常:
/bin/sh /root/aliyun-ddns.sh
六、总结
通过本文的指南,我们成功地创建了一个OpenWrt阿里云DDNS脚本,并将其设置为定时任务,实现了自动更新解析记录的IP地址。