纯Shell实现DNSPOD域名动态更新

  不多说直接看代码,如果移除注释应该是很简单的代码,当然部分地方还是被我复杂化了,估计日志记录还是需要的,之前使用Pythone版的日志记录怪怪的,有几次没成功更新都没记录成功。
  使用这个还是有点前提的,比如要事先知道域名ID和记录ID。和修改部分配置。不过这都没设置为变量的形式,感觉代码足够简单就没有这个必要了。
  首先查看https://www.dnspod.cn/docs/records.html#dns 这个API,一些必要的东西还是要了解的。

#!/bin/bash
#########################################
# author : loveyu                       #
# url : https://loveyu.org           #
#########################################
function post()
{
        #提交域名更新请求
        if [ "" = "$1" ]
        then
                log "call error"
                return 0
        fi
 
        #通过CURL 操作,如果手动指定IP添加 value=$1
        ###########################################
        #
        # 替换中括号中的内容,包含中括号
        # [you email] 你的登录邮箱
        # [you password] 你的密码
        # [you domain_id] .....
        # [you record_id  .....  详见 https://www.dnspod.cn/docs/records.html#dns
        # [you sub_doamian] ....
        #############################################
        result=`curl -s POST https://dnsapi.cn/Record.Ddns -d 'login_email=[you email]&login_password=[you password]&format=json&domain_id=[you domain_id]&record_id=[you record_id]&record_line=默认&sub_domain=[you sub_doamian]'`
        log $1
        log $result
}
 
function log()
{
        #输出一个记录值
        echo -n `date +'[%Y-%m-%d %H:%M:%S]'`
        echo " $1"
}
 
function get_ip(){
        #获取外网IP地址
        #花生壳的服务
        curl -s http://members.3322.org/dyndns/getip
}
 
function d_lookup() {
        if [ "" = "$1" ]
        then
                log "call error"
                echo "nslookup error"
                exit
        fi
        #域名解析地址查询
        #如果不支持nslookup 请自己安装dns查询工具
        nslookup $1 | sed -n -e '4,$p' | awk '/Address/{print $2}'
}
 
ip=$(get_ip) #获取外网IP
#############################################################
#
#  请将 [you domain] 替换为你的域名 如 loveyu.org ,无括号
#
#############################################################
new_ip=$(d_lookup [you domain]) #查询当前域名IP
 
#如果需要初始化时提交一次,可以直接使用 post $ip,然后把下面的注释掉
if [ "$ip" != "$new_ip" ]
then
        post $ip #初始DNS查询不相等时提交数据
fi
 
while :
do
        sleep 30
        new_ip=$(get_ip)
        if [ "$ip" != "$new_ip" ]
        then
                #30秒的轮询数据查询
                post $new_ip
                ip=$new_ip
        fi
done

详细情况可以查看Gist:https://gist.github.com/loveyu/2715a7469927b49a50f3

15条评论在“纯Shell实现DNSPOD域名动态更新”

  1. 每次看到shell都会默默地鄙视一番windows的cmd,写一个if都各种纠结。

写下你最简单的想法