shell脚本动态域名解析阿里云
下面是一个利用Shell脚本调用阿里云DNS API实现动态域名解析(DDNS)的示例。该方案适用于家庭宽带等动态公网IP环境,主要依赖阿里云的域名解析API。
🖥️ 阿里云DDNS Shell脚本示例
#!/bin/bash
# 阿里云DDNS动态域名解析脚本
# 使用方法:1. 修改下方配置项 2. 设置为定时任务(如每10分钟执行一次)
# 配置区域 - 开始
# 阿里云AccessKey (建议使用子账户的RAM权限)
AccessKeyId="你的AccessKeyId"
AccessKeySecret="你的AccessKeySecret"
# 域名配置
DomainName="example.com" # 主域名
SubDomain="www" # 子域名前缀 (如www对应www.example.com)
TTL="600" # TTL缓存时间(秒),免费版最低600
# 获取本机公网IP的方式
GetIPCommand="curl -s whatismyip.akamai.com"
# 配置区域 - 结束
# 函数:获取当前域名解析IP
get_dns_ip() {
local domain=$1
nslookup $domain 223.5.5.5 2>/dev/null | grep 'Address:' | tail -n1 | awk '{print $NF}'
}
# 函数:URL编码
urlencode() {
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
}
# 函数:发送API请求
send_request() {
local args="AccessKeyId=$AccessKeyId&Action=$1&Format=json&$2&Version=2015-01-09"
local hash=$(echo -n "GET&%2F&$(echo "$args" | urlencode)" | openssl dgst -sha1 -hmac "$AccessKeySecret&" -binary | openssl base64)
curl -s "http://alidns.aliyuncs.com/?$args&Signature=$(echo "$hash" | urlencode)"
}
# 函数:获取RecordId
get_record_id() {
send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&SubDomain=$FullDomain&Timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ | urlencode)"
}
# 函数:更新解析记录
update_dns() {
local record_id=$1
local new_ip=$2
send_request "UpdateDomainRecord" "RR=$SubDomain&RecordId=$record_id&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&TTL=$TTL&Timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ | urlencode)&Type=A&Value=$new_ip"
}
# 主程序
echo "[$(date '+%Y/%m/%d %H:%M:%S')] DDNS检查开始"
# 获取当前公网IP
CurrentIP=$($GetIPCommand)
if [ -z "$CurrentIP" ]; then
echo "错误:无法获取公网IP"
exit 1
fi
FullDomain="$SubDomain.$DomainName"
# 获取当前DNS解析IP
DNS_IP=$(get_dns_ip $FullDomain)
if [ "$CurrentIP" = "$DNS_IP" ]; then
echo "IP未变化 ($CurrentIP),无需更新"
exit 0
fi
echo "检测到IP变化: 本地IP=$CurrentIP, DNS记录=$DNS_IP"
# 获取RecordId并更新
RecordResponse=$(get_record_id)
RecordId=$(echo "$RecordResponse" | grep -o '"RecordId":"[^"]*' | cut -d'"' -f4)
if [ -n "$RecordId" ]; then
UpdateResult=$(update_dns $RecordId $CurrentIP)
if echo "$UpdateResult" | grep -q "RecordId"; then
echo "DDNS更新成功: $FullDomain -> $CurrentIP"
else
echo "DDNS更新失败: $UpdateResult"
fi
else
echo "错误:无法获取RecordId"
fi
🔧 使用前配置
-
阿里云AccessKey配置
- 登录阿里云控制台 → 访问控制RAM → 创建子账户(推荐)或使用主账户
- 授权策略:
AliyunDNSFullAccess - 获取AccessKey ID和Secret
-
域名准备
- 在阿里云域名控制台添加A记录
- 记录类型:A
- 主机记录:按需填写(如www)
- 记录值可先随意填写,脚本运行后会自动更新
⚙️ 部署与自动化
-
保存脚本
# 将脚本保存为 aliddns.sh chmod +x aliddns.sh -
配置定时任务
# 编辑crontab (每20分钟执行一次) crontab -e # 添加以下行: */20 * * * * /path/to/your/aliyun-ddns.sh >> /path/to/your/ddns.log 2>&1
📌 注意事项
- IP获取服务:示例使用了
whatismyip.akamai.com,若需要可替换为其他IP查询服务 - 脚本兼容性:确保系统已安装
curl、openssl等基础工具 - 安全提醒:妥善保管AccessKey,建议使用RAM子账户并授予最小必要权限
- 调试技巧:首次运行可手动执行脚本,观察输出信息
💡 扩展功能
如需更完善的功能(如IPv6支持、微信通知等),可参考开源项目如risfeng/aliyun-ddns-shell,它提供了更完整的实现方案。
希望这个脚本能帮助您轻松实现动态域名解析。如果有任何问题,欢迎继续交流!

浙公网安备 33010602011771号