Skip to content

Instantly share code, notes, and snippets.

@whlsxl
Created February 1, 2020 12:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save whlsxl/2ff125c1fb778055866aee2700d87376 to your computer and use it in GitHub Desktop.
Save whlsxl/2ff125c1fb778055866aee2700d87376 to your computer and use it in GitHub Desktop.
#!/bin/bash
##配置信息
host="www" #主机名
domain="test.com" #你的域名
ak="kkkk" #你的阿里云app key
sk="yyyyyy&" #“你的阿里云app secret&” 注意后面多个“&”
#which nslookup >/dev/null 2>$1 || yum install bind-utils -y
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
#前置函数
urlencode1() {
local length="${#1}"
i=0
out=""
for i in $(awk "BEGIN { for ( i=0; i<$length; i++ ) { print i; } }")
do
local c="${1:$i:1}"
case $c in
[a-zA-Z0-9.~'&'=_-]) out="$out$c" ;;
*) out="$out`printf '%%%02X' "'$c"`" ;;
esac
i=$(($i + 1))
done
echo -n $out
}
urlencode2() {
local length="${#1}"
i=0
out=""
for i in $(awk "BEGIN { for ( i=0; i<$length; i++ ) { print i; } }")
do
local c="${1:$i:1}"
case $c in
[a-zA-Z0-9.~_-]) out="$out$c" ;;
*) out="$out`printf '%%%02X' "'$c"`" ;;
esac
i=$(($i + 1))
done
echo -n $out
}
send_request() {
args="AccessKeyId=$ak&Action=$1&Format=json&$2&Version=2015-01-09"
StringToSign1="$(urlencode1 $args)"
StringToSign2="GET&%2F&$(urlencode2 $StringToSign1)"
hash=$(urlencode2 $(echo -n "$StringToSign2" | openssl dgst -sha1 -hmac $sk -binary | openssl base64))
RESULT=$(curl -k -s "https://alidns.aliyuncs.com/?$args&Signature=$hash") ## 2> /dev/null)
echo $RESULT
}
query_recordid() {
if [ "$host" = "@" ]; then
echo `send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$domain&Timestamp=$timestamp"`
else
echo `send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$host.$domain&Timestamp=$timestamp"`
fi
}
update_record() {
echo `send_request "UpdateDomainRecord" "RR=$host&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip"`
}
add_record() {
echo `send_request "AddDomainRecord&DomainName=$domain" "RR=$host&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=A&Value=$ip"`
}
##主程序入口
timestamp=`date -u +"%Y-%m-%dT%H:%M:%SZ"`
ip_network="wan"
#读取本地数据库存储的信息,若有
ipfilename=$(echo $(basename $0)) #获取自身文件名
ipfilename=$(cd "$(dirname "$0")"; pwd)/${ipfilename%.*}
if [ -f "$ipfilename"_ip ]
then
. "$ipfilename"_ip
else
record_id="" ;saved_ip="" ;saved_host="" ;saved_domain=""
fi
echo record_id="$record_id" saved_ip="$saved_ip" saved_host="$saved_host" saved_domain="$saved_domain"
ip=""
RETRY="0"
while [ $RETRY -lt 5 ]; do #获取本机ipv4地址信息
#ip=$(ubus call network.interface.$ip_network status | grep \"address\" | grep -oE '[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}')
ip=$(curl -s http://ipv4.icanhazip.com)
RETRY=$((RETRY+1))
if [ -z "$ip" ];then
sleep 3
else
break
fi
echo $ip
done
#获取DNS域名服务器对域名解析的ipv4地址
#此处由<a id="a_comment_author_3947953" href="http://home.cnblogs.com/u/1351825/" target="_blank">jethroso</a>指正,在此以表感谢
if [ "$ip" == "$saved_ip" ];then
#if [ "$host" == "@" -o "$host" == "" ];then
#IPDNS=$(nslookup $domain dns16.hichina.com 2>/dev/null | sed -n 's/Address 1: \([0-f.]*\)/\1/p' | sed -n '2p' | grep -oE '[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}')
#else
#IPDNS=$(nslookup $host.$domain 8.8.8.8 2>/dev/null | sed -n 's/Address 1: \([0-f.]*\)/\1/p' | sed -n '2p' | grep -oE '[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}')
IPDNS=$(/bin/ping ${host}.${domain} -c 1 -w 1 |grep PING | awk -F ')' '{print $1}' |awk -F '(' '{print $2}')
#  fi
fi
#检查比对本地数据库存储的ip
#也可以与IPDNS进行比较,替换saved_ip为IPDNS即可
if [ "$ip" = "$saved_ip" -a "$host" = "$saved_host" -a "$domain" = "$saved_domain" ];then
echo "$(date +"%Y-%m-%d %H:%M:%S")--Host:[$host.$domain] Already updated."
exit 0
fi
#查询解析记录信息
RESULT=`query_recordid`
record_id=$(echo $RESULT | grep -o "RR\":\"$host\",\"Status\":\"[a-zA-Z.]*\",\"Value\":\"[0-9.]*\",\"Weight\":[0-9]*,\"RecordId\":\"[0-9]*\"" | grep -o "\"RecordId\":\"[0-9]*\"" | grep -o "[0-9]*")
if [ "$record_id" = "" ]
then
#新增解析记录
RESULT=`add_record`
record_id=$(echo $RESULT | grep -o "RecordId\":\"[0-9]*\"" | grep -o "[0-9]*")
echo "$RESULT"
if [ "$record_id" != "" ]
then
echo "$(date +"%Y-%m-%d %H:%M:%S") -- Added Host [$host.$domain] (IP: $ip)"
echo "record_id=${record_id};saved_ip=${ip};saved_host=${host};saved_domain=${domain}" > "$ipfilename"_ip
else
echo "Not Find Such Host $host.$domain"
fi
else
#更新解析记录
RESULT=`update_record $record_id`
record_id=$(echo $RESULT | grep -o "RecordId\":\"[0-9]*\"" | grep -o "[0-9]*")
echo "$RESULT"
echo "$(date +"%Y-%m-%d %H:%M:%S") -- Update Host [$host.$domain] (IP: $ip)"
echo "record_id=$record_id ;saved_ip=$ip ;saved_host=$host ;saved_domain=$domain" > "$ipfilename"_ip
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment