使用shell实现阿里云动态DNS

https://github.com/timwai/aliyunDDNS-shell
脚本全部使用基础的命令实现,支持在openwrt中使用
修改以下参数为你自己的参数

ACCESS_KEY_ID=“你的AccessKeyId”
ACCESS_SECRET=“你的AccessSecret”
DOMAIN_NAME=“example.com”
RR=“www”
TYPE=“A”

也可在执行时覆盖以上参数

sh alidns.sh -rr www -domian examole.com -type A -id 你的AccessKeyId -secret 你的AccessSecret

#!/bin/bash
#
#####################################################################
#
#Author:                Tingjusting
#Email:                 tingjusting@gmail.com
#Date:                  2023-02-17
#FileName:             alidns.sh
#URL:                   https://github.com/ledrsnet
#Description:          阿里云DDNS
#Copyright (C):         2023 All rights reserved
#Signature Api:         https://help.aliyun.com/document_detail/315526.html
#Alidns Api:           https://next.api.aliyun.com/document/Alidns/2015-01-09
#
#####################################################################

ACCESS_KEY_ID="你的AccessKeyId"
ACCESS_SECRET="你的AccessSecret"
DOMAIN_NAME="example.com"
RR="www"
TYPE="A" #A为ipv4,AAAA为ipv6

while [[ $# -gt 0 ]];
do
  case $1 in
    -id|-AccessKeyId)
      ACCESS_KEY_ID=$2
      shift
      shift
      ;;
    -secret|-AccessSecret)
      ACCESS_SECRET=$2
      shift
      shift
      ;;
    -domain|-DomainName)
      DOMAIN_NAME=$2
      shift
      shift
      ;;
    -rr|-RR)
      RR=$2
      shift
      shift
      ;;
    -type|-Type)
      TYPE=$2
      shift
      shift
      ;;
    *)
      shift
      shift
    ;;
  esac
done

if [[ $TYPE == "AAAA" ]]; then
    #IP=`curl -sS https://ipv6.netarm.com/`
    IP=`ip -6 addr|grep dynamic|grep -m1 '/128'|awk '{print $2}'|cut -d'/' -f1`
    if [[ ! $IP ]]; then
      IP=`ip -6 addr|grep dynamic|grep -m1 '/64'|awk '{print $2}'|cut -d'/' -f1`
    fi
else
    IP=`curl -sS https://ipv4.netarm.com/`
fi

if [[ ! $IP ]]; then
    echo "Can not get the ip of type $TYPE"
    exit 1
fi

urlEncode() {
  # 将输入的字符串转换为16进制编码的值
  local length="${#1}"
  length=$((length-1))
  for i in $(seq 0 $length)
  do
    local c="${1:i:1}"
    case $c in
      [a-zA-Z0-9.~_-])
        printf "$c"
        ;;
      *)
        printf '%%%02X' "'$c"
        ;;
    esac
  done
}


DescribeDomainRecords(){
    URL_PARAMS="AccessKeyId=${ACCESS_KEY_ID}"
    URL_PARAMS="${URL_PARAMS}&Action=DescribeDomainRecords"
    URL_PARAMS="${URL_PARAMS}&DomainName=${DOMAIN_NAME}"
    URL_PARAMS="${URL_PARAMS}&Format=JSON"
    URL_PARAMS="${URL_PARAMS}&RRKeyWord=$RR"
    URL_PARAMS="${URL_PARAMS}&SignatureMethod=HMAC-SHA1"
    URL_PARAMS="${URL_PARAMS}&SignatureNonce="`date +%s%3N`
    URL_PARAMS="${URL_PARAMS}&SignatureVersion=1.0"
    URL_PARAMS="${URL_PARAMS}&Timestamp="`urlEncode $(date -u +"%Y-%m-%dT%H:%M:%SZ")`
    URL_PARAMS="${URL_PARAMS}&Type=$TYPE"
    URL_PARAMS="${URL_PARAMS}&Version=2015-01-09"

    STRING_To_SIGN="GET&%2F&`urlEncode ${URL_PARAMS}`"

    SIGNATURE=`echo -n ${STRING_To_SIGN} | openssl dgst -hmac "${ACCESS_SECRET}&" -sha1 -binary | openssl enc -base64`
    SIGNATURE=`urlEncode $SIGNATURE`

    URL_PARAMS="${URL_PARAMS}&Signature=${SIGNATURE}"
    curl -ss "http://alidns.aliyuncs.com?${URL_PARAMS}"
}

UpdateDomainRecord(){
    URL_PARAMS="AccessKeyId=${ACCESS_KEY_ID}"
    URL_PARAMS="${URL_PARAMS}&Action=UpdateDomainRecord"
    URL_PARAMS="${URL_PARAMS}&Format=JSON"
    URL_PARAMS="${URL_PARAMS}&RR=$RR"
    URL_PARAMS="${URL_PARAMS}&RecordId=$1"
    URL_PARAMS="${URL_PARAMS}&SignatureMethod=HMAC-SHA1"
    URL_PARAMS="${URL_PARAMS}&SignatureNonce="`date +%s%3N`
    URL_PARAMS="${URL_PARAMS}&SignatureVersion=1.0"
    URL_PARAMS="${URL_PARAMS}&Timestamp="`urlEncode $(date -u +"%Y-%m-%dT%H:%M:%SZ")`
    URL_PARAMS="${URL_PARAMS}&Type=$TYPE"
    URL_PARAMS="${URL_PARAMS}&Value=`urlEncode $IP`"
    URL_PARAMS="${URL_PARAMS}&Version=2015-01-09"

    STRING_To_SIGN="GET&%2F&`urlEncode ${URL_PARAMS}`"
    
    SIGNATURE=`echo -n ${STRING_To_SIGN} | openssl dgst -hmac "${ACCESS_SECRET}&" -sha1 -binary | openssl enc -base64`
    SIGNATURE=`urlEncode $SIGNATURE`

    URL_PARAMS="${URL_PARAMS}&Signature=${SIGNATURE}"
    curl -ss "http://alidns.aliyuncs.com?${URL_PARAMS}"
}

AddDomainRecord(){
    URL_PARAMS="AccessKeyId=${ACCESS_KEY_ID}"
    URL_PARAMS="${URL_PARAMS}&Action=AddDomainRecord"
    URL_PARAMS="${URL_PARAMS}&DomainName=${DOMAIN_NAME}"
    URL_PARAMS="${URL_PARAMS}&Format=JSON"
    URL_PARAMS="${URL_PARAMS}&RR=$RR"
    URL_PARAMS="${URL_PARAMS}&SignatureMethod=HMAC-SHA1"
    URL_PARAMS="${URL_PARAMS}&SignatureNonce="`date +%s%3N`
    URL_PARAMS="${URL_PARAMS}&SignatureVersion=1.0"
    URL_PARAMS="${URL_PARAMS}&Timestamp="`urlEncode $(date -u +"%Y-%m-%dT%H:%M:%SZ")`
    URL_PARAMS="${URL_PARAMS}&Type=$TYPE"
    URL_PARAMS="${URL_PARAMS}&Value=`urlEncode $IP`"
    URL_PARAMS="${URL_PARAMS}&Version=2015-01-09"

    STRING_To_SIGN="GET&%2F&`urlEncode ${URL_PARAMS}`"
    
    SIGNATURE=`echo -n ${STRING_To_SIGN} | openssl dgst -hmac "${ACCESS_SECRET}&" -sha1 -binary | openssl enc -base64`
    SIGNATURE=`urlEncode $SIGNATURE`

    URL_PARAMS="${URL_PARAMS}&Signature=${SIGNATURE}"
    curl -ss "http://alidns.aliyuncs.com?${URL_PARAMS}"
}

RECORDS=$(DescribeDomainRecords)

if echo $RECORDS|grep -q '"'$RR'"'; then
    if echo $RECORDS|grep -q '"'$IP'"'; then
        echo "$DOMAIN_NAME $IP"
        echo "The DNS record already exists."
        exit 1
    fi
    RECORD=`echo $RECORDS|sed 's/{"RR":"/\n\r{"RR":"/g'|sed 's/]},"PageNumber"/\n\r]},"PageNumber"/g'|grep '"'$RR'"'`
    RECORD=${RECORD#*'"RecordId":"'}
    RECORD_ID=${RECORD%'","TTL"'*}
    RESULT=`UpdateDomainRecord $RECORD_ID`
    if echo $RESULT|grep -q 'RecordId'; then
        echo "$DOMAIN_NAME $IP"
        echo "Add DNS record success."
    else
        echo "$DOMAIN_NAME $IP"
        echo "Add DNS record fail."
    fi
else
    AddDomainRecord
fi
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值