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 ##############################