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