在bash中使用DNSPod的API接口实现DDNS客户端

  • 2012-03-12更新
    判断DNSPOD API返回值为空的情况,这种情况每天会出现2-3次,这种情况不退出程序,而是继续等待;
  • 2012-03-11更新
    • 调整了部分正则表达式的写法;
    • 增加了错误判断功能。
  • 2012-03-10 更新
    支持多域名多记录。
    • 多域名使用数组定义,每个元素代表一个域名的一组要更新的子记录;
    • 仅支持A记录的更新,因为其他类型的记录可能有重名的情况出现;
    • 每一组记录,以空格分隔域名和子域名;
    • 第一个空格前为主域名,后面用空格分离多个子域名;
    • 如果使用泛域名,必须用 \* 转义。

以下为要更新的域名范例:

1domainList[0]='domain1.com \* @'
2domainList[1]='domain2.com www subdomain1 subdomain2'

使用方法:

  • 配置domainList数组,详细内容见上方;
  • 配置delay的值,多长时间检测一次ip变化,单位是秒。

我一直想买购买 github 的付费服务,但7美刀的价格算起来比一个月的电费(下面有计算)还要贵许多。因此决定使用DDNS来实现自己的git服务器。

设备和网络的情况是这样的:

  • 10M电信光纤网络;
  • 使用2008年购买的HP mini-note 2133做服务器;
  • 操作系统为ArchLinux。

服务器情况如下:

  • VIA C7-M 1.5G单核;
  • DDR2 667 2G内存;
  • 5400RPM 160GB硬盘;
  • 实测功耗20W,月耗电约7-8元,比7美刀要便宜多了;
  • 不但可以架设git服务器,还可以客串http、ftp、mysql……。

电信的光纤网络也是使用PPPOE拨号,但电信似乎有连接过长时间后自动断线的功能,所以希望用拨号后不下线的方式实现”伪固定IP“是不现实的,必须使用DDNS来实现解析。

原来我一直用老牌的 花生壳 来实现DDNS,花生壳集成在TP-link路由器中,使用起来还算方便。但花生壳的web界面的体验和功能比 DNSPod差了太多,且有各种各样的限制,让人非常的不爽。

DNSPod提供了全功能的API ,完全可以使用它来实现DDNS。于是乎,我使用初学的bash,来实现了这样一个DDNS客户端。

我实现的思路是这样的:

  1. 访问DNSPod的API,获得要实现DDNS的域名的当前对应ip;
  2. 访问一个外部网站,获取本机的外网ip;
  3. 比较外网ip和DNSPod保存的ip,若不相同,就更新DNSPod上的ip地址;
  4. 每5分钟重复2-3。

注意事项:

  1. DNSPod在检测到5分钟内登录错误30次后,会禁用该账号的登录。所以必须在每次调用API的时候,都检测返回代码;
  2. 不要过多的调用DNSPod的API,尽量使用缓存。

将dnspodsh复制到/usr/bin下,并在/etc/rc.local中加入下面一行即可实现你自己的免费DDNS:

1/usr/bin/dnspodsh dnspod_name dnspod_passwaord &>/dev/null

如果遇到错误,可以查看/var/log/dnspodsh.log。

dnspodsh下载:https://gist.github.com/1822396