<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="Linux纯Shell实现DNSPod动态域名">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">admin</a><br />时间:2015-04-02 12:49<br />分类:<a href="index.php?action=list&amp;cid=3&amp;hash=">电脑技术</a><br />内容:
Linux纯Shell实现DNSPod动态域名


开发背景：


公司有台嵌入式拨号上网设备，内置busybox和完整wget命令(支持https协议)，但没有curl、python、ruby、php等扩展工具可用。网上现有基于DNSPod实现的Linux脚本无法在该设备上运行，于是在同事小路的协助下写了个Shell版动态域名客户端，现在发布出来希望能给需要的朋友带来一些方便。


相关链接：


DnsPod官方文档


功能介绍：


&ndash; 优雅的函数封装，灵活的更新策略

&ndash; 基于DNSPod最新用户API实现动态域名客户端

&ndash; 支持基于系统计划任务实现更新，防止脚本意外终止

&ndash; 可运行于多数类unix系统中，包括部分嵌入式小型系统

&ndash; 依赖sed/wget/nslookup命令，wget也可使用curl替代


更新说明：


2013年8月9日

&ndash; 修正一处笔误


2013年8月8日

&ndash; 默认DNS查询服务器更换为114.114.114.114


2013年5月23日

&ndash; [[]]替换为[]，防止一些嵌入设备无此命令


2013年4月1日

&ndash; 完善说明文档

&ndash; 优化全局变量定义

&ndash; 刚发现DnsPod官方API示例已收录本文


2013年3月29日

&ndash; 从dns服务器获取子域名IP

&ndash; 实现仅IP变更后才提交更新


2013年3月28日

&ndash; 现在是13年3月，故而第一个版本就定为v3.3吧

&ndash; 使用APIv4.6实现简单的动态更新功能


项目源码：


#!/bin/sh



#################################################

# AnripDdns v3.08.09

# 基于DNSPod用户API实现的动态域名客户端

# 作者: 若海[mail@anrip.com]

# 介绍: http://www.anrip.com/ddnspod

# 时间: 2013-08-08 23:25:00

#################################################

 

# 全局变量表

arPass=arMail=&quot;&quot;

 

# 获得外网地址

arIpAdress() {

    local inter=&quot;http://members.3322.org/dyndns/getip&quot;

    wget --quiet --no-check-certificate --output-document=- $inter

}

 

# 查询域名地址

# 参数: 待查询域名

arNslookup() {

    local dnsvr=&quot;114.114.114.114&quot;

    nslookup ${1} $dnsvr | tr -d '\n[:blank:]' | sed 's/.\+1 \([0-9\.]\+\)/\1/'

}

 

# 读取接口数据

# 参数: 接口类型 待提交数据

arApiPost() {

    local agent=&quot;AnripDdns/3.08(mail@anrip.com)&quot;

    local inter=&quot;https://dnsapi.cn/${1:?'Info.Version'}&quot;

    local param=&quot;login_email=${arMail}&amp;login_password=${arPass}&amp;format=json&amp;${2}&quot;

    wget --quiet --no-check-certificate --output-document=- --user-agent=$agent --post-data $param $inter

}

 

# 更新记录信息

# 参数: 主域名 子域名

arDdnsUpdate() {

    local domainID recordID recordRS recordCD

    # 获得域名ID

    domainID=$(arApiPost &quot;Domain.Info&quot; &quot;domain=${1}&quot;)

    domainID=$(echo $domainID | sed 's/.\+{&quot;id&quot;:&quot;\([0-9]\+\)&quot;.\+/\1/')

    # 获得记录ID

    recordID=$(arApiPost &quot;Record.List&quot; &quot;domain_id=${domainID}&amp;sub_domain=${2}&quot;)

    recordID=$(echo $recordID | sed 's/.\+\[{&quot;id&quot;:&quot;\([0-9]\+\)&quot;.\+/\1/')

    # 更新记录IP

    recordRS=$(arApiPost &quot;Record.Ddns&quot; &quot;domain_id=${domainID}&amp;record_id=${recordID}&amp;sub_domain=${2}&amp;record_line=默认&quot;)

    recordCD=$(echo $recordRS | sed 's/.\+{&quot;code&quot;:&quot;\([0-9]\+\)&quot;.\+/\1/')

    # 输出记录IP

    if [ &quot;$recordCD&quot; == &quot;1&quot; ]; then

        echo $recordRS | sed 's/.\+,&quot;value&quot;:&quot;\([0-9\.]\+\)&quot;.\+/\1/'

        return 1

    fi

    # 输出错误信息

    echo $recordRS | sed 's/.\+,&quot;message&quot;:&quot;\([^&quot;]\+\)&quot;.\+/\1/'

}

 

# 动态检查更新

# 参数: 主域名 子域名

arDdnsCheck() {

    local postRS

    local hostIP=$(arIpAdress)

    local lastIP=$(arNslookup &quot;${2}.${1}&quot;)

    echo &quot;hostIP: ${hostIP}&quot;

    echo &quot;lastIP: ${lastIP}&quot;

    if [ &quot;$lastIP&quot; != &quot;$hostIP&quot; ]; then

        postRS=$(arDdnsUpdate $1 $2)

        echo &quot;postRS: ${postRS}&quot;

        if [ $? -ne 1 ]; then

            return 0

        fi

    fi

    return 1

}

 

###################################################

 

# 设置用户参数

arMail=&quot;user@anrip.com&quot;

arPass=&quot;anrip.net&quot;

 

# 检查更新域名

arDdnsCheck &quot;anrip.com&quot; &quot;lab&quot;

arDdnsCheck &quot;anrip.net&quot; &quot;lab&quot;




</p><p>
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
