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

来源:互联网 发布:数据库中省略为什么 编辑:程序博客网 时间:2024/06/06 18:27

背景

开发服务器放在公司内网,但需要从外网可以随意访问。而公司是通过拨号,因此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 fileif [ -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关键字相同的功能外,还可以测试复杂表达式,并支持'&&', '||', '!' 逻辑组合, 以及正则表达式(使用'=~'操作符)。

0 0
原创粉丝点击