使用shell脚本自动更新动态域名

背景

开发服务器放在公司内网,但需要从外网可以随意访问。而公司是通过拨号,因此IP不能固定。

传统的做法是:在路由器上将DDNS帐号密码填上去,然后就可以不管了。但这需要DDNS服务提供商,一般大型靠谱的DNS服务商却不支持DDNS服务。

我们公司的DNS是托管在dnspod上的,他们的域名更新速度快,还可以对访问线路做解析优化,在目前网通电信不通畅的情况下还是很有用的,唯一遗憾的是没有对DDNS的支持。

解决方案

但是有一点希望的是:DNSPod提供了DNS操作API,所以,可以通过API变相实现DDNS,只是需要自己写点代码就搞定了。

思路是:

通过corn周期性的(每分钟)执行一个程序,此程序通过外部网站获取自己的外网ip,然后跟自己存储下来的前一个IP比较,如果变了则更新DNS,否则不操作。

之所以这么做,是因为服务商不允许频繁做更新DNS的操作。

实现

#!/bin/sh

#每次IP变动都将追加写入到这个文件中
IPFILE=/tmp/ipNow


#通过ifconfig.me网站检测自己的公网IP
#ip=`curl -s 'http://checkip.dyndns.org' | sed 's/.*Current IP Address: \([0-9\.]*\).*/\1/g'`
ip=`curl -s 'ifconfig.me'`
echo `date +%FT%T` "ip now:$ip"
#update ip record file
if [ -e $IPFILE ]; then
    echo "ip:$ip"
    #取得最后一个IP
    ipOld=`cat $IPFILE | tail -n 1 | awk '{print $1}'`
    echo "cat IPFILE:$ipOld"
    if [ -n "$ip" ]; then
        #注意下面的测试条件,一定要对变量$ip用双引号包起来,以防$ip为空时导致语法错误
        if [[ "$ip" != $ipOld ]]; then
            echo "$ip `date +%FT%T`" >> "$IPFILE"
            echo "ip is different with the last time!"
            #update DDNS
            re=`curl -X POST https://dnsapi.cn/Record.Ddns -d "login_email=qian.xiong2005@gmail.com&login_password=xxx&format=json&domain_id=7483437&record_id=35656076&sub_domain=dev&value=$ip&record_line=默认"`
            echo $re >> /var/log/updateDDNS.log;
        else
            echo "ip not change
    ";
        fi; 
    fi; 
else
    echo $ip >> "$IPFILE"
fi

技巧

检测IP

如果想要检测是否为一个IP地址,可以使用如下方法做正则表达式判断:

if [[ $ip =~ ([0-9]{2}.?){4} ]]; then echo 'yes'; else echo 'no'; fi

注意上面的'=~'操作符,表示右边是一个正则表达式。特别需要说明的是:

  1. 表达式没有引号;
  2. 没有像其它语言中使用斜线将整个表达式包裹起来。


shell 对条件测试方法

有3种:test关键字;单层方括号'[ arg ... ]'; 双层方括号'[[ expression ]];

前两者是同义词,只是语法不一样。双层方括号功能更强大,除能实现test关键字相同的功能外,还可以测试复杂表达式,并支持'&&', '||', '!' 逻辑组合, 以及正则表达式(使用'=~'操作符)。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,您需要获取阿里云的AccessKey ID和AccessKey Secret,以便于通过API进行操作。 然后,可以使用cURL命令,向阿里云的API发送HTTP请求,来实现动态DNS的功能。 以下是一个简单的阿里云DDNS shell脚本的示例: ``` #!/bin/bash # 阿里云AccessKey ID access_key_id="<your access key id>" # 阿里云AccessKey Secret access_key_secret="<your access key secret>" # 域名 domain="<your domain>" # 主机记录 RR="<your RR>" # 获取当前公网IP ip=`curl -s http://ipv4.icanhazip.com` # 构造签名参数 timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"` signature=`echo -n "GET&%2F&AccessKeyId%3D$access_key_id%26Action%3DDescribeDomainRecords%26DomainName%3D$domain%26Format%3DXML%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D$RANDOM%26SignatureVersion%3D1.0%26Timestamp%3D$timestamp%26Type%3D" | openssl dgst -binary -sha1 -hmac "$access_key_secret&" | base64` # 获取解析记录的ID record_id=`curl -s "http://alidns.aliyuncs.com/?Action=DescribeDomainRecords&DomainName=$domain&Format=XML&Signature=$signature&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=$timestamp&Type=&AccessKeyId=$access_key_id" | grep "<RecordId>" | awk -F "<RecordId>" '{print $2}' | awk -F "<" '{print $1}'` # 如果IP有变化,则更新DNS记录 if [ $ip != $record_id ] then timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"` signature=`echo -n "GET&%2F&AccessKeyId%3D$access_key_id%26Action%3DUpdateDomainRecord%26DomainName%3D$domain%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值