阿里云DNS api接口 shell 更改DNS解析

时间:2024-03-08 14:13:36
  1 #!/bin/bash
  2 # alidns.sh
  3 #https://www.cnblogs.com/elvi/p/11663910.html
  4 #阿里云DNS api接口 shell 更改DNS解析
  5 
  6 ##############################
  7 which dig &>/dev/null || { yum install -y bind-utils ; } || { echo "need to install dig";exit 1; }
  8 
  9 ##配置
 10 host="abcd" #主机名
 11 domain="qq.com" #域名
 12 ak="LTAI4FoDtp4y7ENqxxxxxxxxxx"  #阿里云AccessKey ID
 13 sk="lVNCxCVGciaJqUxxxxxxxxxxxx&"  #阿里云Access Key Secret  后面多个 &
 14 timestamp=`date -u +"%Y-%m-%dT%H:%M:%SZ"`
 15 
 16 ##############################
 17 #hash签名使用
 18 urlencode1() {
 19     local length="${#1}"
 20     i=0
 21     out=""
 22     for i in $(awk "BEGIN { for ( i=0; i<$length; i++ ) { print i; } }")
 23     do
 24         local c="${1:$i:1}"
 25         case $c in
 26             [a-zA-Z0-9.~\'&\'=_-]) out="$out$c" ;;
 27             *) out="$out`printf \'%%%02X\' "\'$c"`" ;;
 28         esac
 29         i=$(($i + 1))
 30      done
 31      echo -n $out
 32 }
 33 urlencode2() {
 34     local length="${#1}"
 35     i=0
 36     out=""
 37     for i in $(awk "BEGIN { for ( i=0; i<$length; i++ ) { print i; } }")
 38     do
 39         local c="${1:$i:1}"
 40         case $c in
 41             [a-zA-Z0-9.~_-]) out="$out$c" ;;
 42             *) out="$out`printf \'%%%02X\' "\'$c"`" ;;
 43         esac
 44         i=$(($i + 1))
 45      done
 46      echo -n $out
 47 }
 48 
 49 ##############################
 50 #函数
 51 
 52 send_request() {   
 53 args="AccessKeyId=$ak&Action=$1&Format=json&$2&Version=2015-01-09"
 54 StringToSign1="$(urlencode1 $args)"
 55 StringToSign2="GET&%2F&$(urlencode2 $StringToSign1)"
 56 hash=$(urlencode2 $(echo -n "$StringToSign2" | openssl dgst -sha1 -hmac $sk -binary | openssl base64))
 57 RESULT=$(curl -k -s "https://alidns.aliyuncs.com/?$args&Signature=$hash")  ## 2> /dev/null)
 58 echo $RESULT
 59 }
 60 query_recordid() {
 61  if [ "$host" = "@" ]; then 
 62 echo `send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$domain&Timestamp=$timestamp"`
 63  else
 64 echo `send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$host.$domain&Timestamp=$timestamp"`
 65  fi
 66 }
 67 update_record() {
 68     echo `send_request "UpdateDomainRecord" "RR=$host&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip"`
 69 }
 70 add_record() {
 71     echo `send_request "AddDomainRecord&DomainName=$domain" "RR=$host&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip"`
 72 }
 73 
 74 add_host() {
 75 #echo "新增解析"
 76 RESULT=`add_record`
 77 record_id=$(echo $RESULT | grep -o "RecordId\":\"[0-9]*\"" | grep -o "[0-9]*")
 78 [ "$record_id" = "" ] && { echo "$host.$domain  $ip  AddError";exit 1; }
 79 echo "$host.$domain  $ip  AddHost $(date +\'%F %T\')"
 80 }
 81 
 82 up_host() {
 83 #echo "更新解析"
 84 #查询RecordId
 85 RESULT=`query_recordid`
 86 record_id=$(echo $RESULT | grep -o "RecordId\":\"[0-9]*" | grep -o "[0-9]*")
 87 [ "$record_id" = "" ] && { echo "get record_id error";exit 1; }
 88 #更新
 89 RESULT=`update_record $record_id`
 90 record_id=$(echo $RESULT | grep -o "RecordId\":\"[0-9]*\"" | grep -o "[0-9]*")
 91 [ "$record_id" = "" ] && { echo "$host.$domain  $ip  UpError";exit 1; }
 92 echo "$host.$domain    $ip  UpHost $(date +\'%F %T\')"
 93 }
 94 
 95 ##############################
 96 #获取本地外网ip并更新dns
 97 
 98 # #ip
 99 # UA="Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.3; blog.elven.vip)"
100 # ip=$(curl -s -A "$UA" http://ipv4.icanhazip.com)
101 # ip_dns=$(dig @dns23.hichina.com ${host}.${domain} A +short)
102 # # echo ip  $ip
103 # # echo ip_dns  $ip_dns
104 # [ -n "$ip" ] || { echo "ip error"; }
105 
106 # if [ -n "$ip_dns" -a "$ip_dns" = "$ip" ];then
107     # echo "$host.$domain    $ip_dns"
108 # elif [ "$ip_dns" = "" ];then
109     # add_host
110 # else
111     # up_host
112 # fi
113 
114 ##############################
115 #传参  主机 域名 ip
116 
117 alidns() {
118 # var:  host domain ip
119 host="$1"
120 domain=$2
121 ip=$3
122 ip_dns=$(dig @dns23.hichina.com ${host}.${domain} A +short)
123 
124 if [ $# -eq 2 ];then
125     if [ -n "$ip_dns" ];then
126         echo "$host.$domain    $ip_dns"
127     else
128         echo "$host.$domain  no found"
129     fi
130 elif [ $# -eq 3 ];then
131     if [ "$ip" = "$ip_dns" ];then
132         echo "$host.$domain    $ip_dns"
133     else
134         [ `echo $ip |grep -oE \'[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\' |wc -l` -eq 0 ] && { echo "ip $ip error";exit 1; }
135         [ "$ip_dns" = "" ] && { add_host ; } || { up_host ; }
136     fi
137 else
138     echo "eg:$0  www  abc.com  192.168.18.18"
139 fi
140 }
141 
142 alidns "$@"
143 
144 # 使用实例 增加或更新  *.abc.elven.vip ,通配符使用\'\'
145 # bash alidns.sh  \'*.abc\'  elven.vip  192.168.18.18
146 ##############################
147 # api https://help.aliyun.com/knowledge_detail/39863.html
148 ##############################