我这里的网络自带ipv6-pd,组了台nas想外网直接域名访问。自己折腾了好久,看了一堆帖子,最后把两个代码结合了下,总算搞定了。脚本代码如下。
- #!/bin/sh
- #前置函数
- 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=AAAA&Value=$ip"`
- }
- add_record() {
- echo `send_request "AddDomainRecord&DomainName=$domain" "RR=$host&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=AAAA&Value=$ip"`
- }
-
- ##配置信息
- ##主函数入口
- host="aa" #主机名
- domain="bb.cc" #你的域名
- timestamp=`date -u +"%Y-%m-%dT%H:%M:%SZ"`
- ak="ak" #你的阿里云app key
- sk="sk&" #“你的阿里云app secret&” 注意后面多个“&”
- DUID="DUID" #设备的DUID
-
- #读取本地数据库存储的信息,若有
- 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
- ip=""
- RETRY="0"
- while [ $RETRY -lt 5 ]; do #获取设备ipv6地址信息
- ip=$(cat /tmp/hosts/odhcpd |grep $DUID|cut -f9 -d' '|cut -f1 -d'/')
- RETRY=$((RETRY+1))
- if [ -z "$ip" ];then
- sleep 3
- else
- break
- fi
- done
-
- #获取DNS域名服务器对域名解析的ipv6地址<br>#此处由<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-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}')
- else
- IPDNS=$(nslookup $host.$domain dns16.hichina.com 2>/dev/null | sed -n 's/Address 1: \([0-f.]*\)/\1/p' | sed -n '2p' | grep -oE '[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}')
- 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-f:]*","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
复制代码 配置信息里几个改一下就行,之后怎么定时运行就是另一件事了。可以直接计划任务,也可以放到pppoe拨号时运行的那个文件夹里,拨号时运行。
也可以配合固件整合的ddns,直接修改IP来源为脚本,脚本里就写一句
- cat /tmp/hosts/odhcpd |grep $DUID|cut -f9 -d' '|cut -f1 -d'/'
复制代码 $DUID修改下。完事。
代码来源
https://github.com/Archeb/ADDNS/blob/master/addns.sh https://www.cnblogs.com/jsp1256/p/7764632.html
请不要胡乱输入以及粘贴、复制等方式灌水
请尊重作者、并共同维护网站的正常阅读,否则账户将会被限制发帖、回帖,并且积分可能会被清零,站内短信以及阅读权限等都会受到影响,谢谢。
具体限制方式:https://www.right.com.cn/forum/thread-8307840-1-1.html
|