这个库调用阿里云的云解析API做到动态域名解析,使用Java 1.5编写,可以放在路由器的openwrt系统中运行
参考了阿里云SDK的源码,并做精简
- 使用maven编译
mvn package
- 从aliyun_ddns/target中获取
aliyun_ddns.jar
,将其上传到路由器或服务器上 - 在aliyun_ddns.jar同级目录中编写
config.properties
,内容如下:请参考如何选择 RegionId、地域和可用区、获取AccessKey# 区域ID,一般填写cn-hangzhou即可 regionId=<regionId> # 阿里云API访问ID accessKeyId=<accessKeyId> # 阿里云API访问秘钥 secret=<secret> # 域名 domainName=<example.com> # 匹配RR的正则表达式 recordPattern=
recordPattern
填写正则表达式,用来匹配RR的值。RR指的是二级url,如@
、www
、wap
等。只有匹配了recordPattern的、而且是A记录的才会被匹配,只匹配第一个。如果不填写recordPattern的值,则会找到第一个A记录进行匹配 - 运行aliyun_ddns.jar即可,
java -jar aliyun_ddns.jar
- 从DescribeDomainRecords接口获取域名解析记录列表
- 用正则表达式去匹配查找域名解析记录及其记录值(获取记录的ip)
- 获取公网ip
- 判断公网ip和域名解析记录的值是否相等,如果不等则使用UpdateDomainRecord接口去修改记录,否则不做修改
- 这个库只修改域名解析记录的值,不添加记录,因此需要先手动在阿里云云解析中增加记录
- 如果修改解析记录成功,则退出码(exit code)是
66
;不修改则是0
,其他退出码代表出错。可以编写一个shell脚本来对退出码进行判断做特殊逻辑 - 请不要在意我那蹩脚的英文日志,本来我是输出中文日志的,但我那破路由器跑java有乱码QAQ,我不知道怎么解决所以才改成英文日志的
/root/ddns/ddns.sh:
#!/bin/sh
# 加载环境变量
. /etc/profile > /dev/null
basepath=$(cd `dirname $0`; pwd)
cd "$basepath"
mkdir -p "$basepath/logs"
time_var=$(date '+%Y-%m-%d %H:%M:%S')
log_file="$basepath/logs/$time_var.log"
java -jar aliyun_ddns.jar 1>$log_file 2>&1
exit_code=$?
if [ $exit_code -eq 0 ]; then
# 大部分情况下ip没有变化,此时不需要记录日志
rm "$log_file"
else
date_var=${time_var:0:10}
mkdir -p logs/$date_var
# 修改失败或修改成功的日志将会记录到logs/yyyy-MM-dd/目录中
if [ $exit_code -eq 66 ]; then
mv "$log_file" "$basepath/logs/$date_var/${time_var}_success.log"
else
mv "$log_file" "$basepath/logs/$date_var/${time_var}_fail.log"
fi
fi
crontab配置每分钟定时检查:
* * * * * sh /root/ddns/ddns.sh
开机启动,配置/etc/rc.local
sh /root/ddns/ddns.sh