DNSPod的API接口实现DDNS客户端

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

将dnspodsh复制到/usr/bin下设置成可执行属性,并在/etc/rc.local中加入下面一行即可实现你自己的免费DDNS:
/usr/bin/dnspodsh dnspod_name dnspod_passwaord &>/dev/null

保存时注意使用LINUX格式和UTF8编码
设置域名的地方有2个数组,如果只有一个域名的话可以这么设置:
domainList[0]='baidu.com * @'
domainList[1]='baidu.com www'

文件名:dnspodsh

内容:

#!/bin/bash

##############################
# dnspodsh v0.3
# 基于dnspod api构架的bash ddns客户端
# 作者:zrong(zengrong.net)
# 详细介绍:http://zengrong.net/post/1524.htm
# 创建日期:2012-02-13
# 更新日期:2012-03-11
##############################

login_email=${1:?'必须提供登录名'}
login_password=${2:?'必须提供密码'}
format="json"
lang="en"
userAgent="dnspodsh/0.3(zrongzrong@gmail.com)"
commonPost="login_email=$login_email&login_password=$login_password&format=$format&lang=$lang"

apiUrl='https://dnsapi.cn/'
ipUrl='http://members.3322.org/dyndns/getip'

# 要处理的域名数组,每个元素代表一个域名的一组记录
# 在数组的一个元素中,以空格分隔域名和子域名
# 第一个空格前为主域名,后面用空格分离多个子域名
# 如果使用泛域名,必须用*转义
domainList[0]='domain1.com * @ www'
domainList[1]='domain2.com subdomain subdomain2'

# 多长时间比较一次ip地址
delay=300

# logfile
logDir='/var/log'
logFile=$logDir'/dnspodsh.log'
traceFile=$logDir'/dnspodshtrace.log'

# 检测ip地址是否符合要求
checkip()
{
# ipv4地址
if [[ "$1" =~ ^([0-9]{1,3}.){3}[0-9]{1,3}$ ]];then
return 0
# ipv6地址
elif [[ "$1" =~ ^([�-fA-F]{1,4}:){7}[�-fA-F]{1,4}$|^:((:[�-fA-F]{1,4}){1,6}|:)$|^[�-fA-F]{1,4}:((:[�-fA-F]{1,4}){1,5}|:)$|^([�-fA-F]{1,4}:){2}((:[�-fA-F]{1,4}){1,4}|:)$|^([�-fA-F]{1,4}:){3}((:[�-fA-F]{1,4}){1,3}|:)$|^([�-fA-F]{1,4}:){4}((:[�-fA-F]{1,4}){1,2}|:)$|^([�-fA-F]{1,4}:){5}:([�-fA-F]{1,4})?$|^([�-fA-F]{1,4}:){6}:$ ]];then
return 0
fi
return 1
}

getUrl()
{
#curl -s -A $userAgent -d $commonPost$2 --trace $traceFile $apiUrl$1
curl -s -A $userAgent -d $commonPost$2 $apiUrl$1
}

getVersion()
{
getUrl "Info.Version"
}

getUserDetail()
{
getUrl "User.Detail"
}

writeLog()
{
if [ -w $logDir ];then
local pre=`date`
for arg in $@;do
pre=$pre't'$arg
done
echo -e $pre>>$logFile
fi
echo -e $1
}

getDomainList()
{
getUrl "Domain.List" "&type=all&offset=0&length=10"
}

# 根据域名id获取记录列表
# $1 域名id
getRecordList()
{
getUrl "Record.List" "&domain_id=$1&offset=0&length=20"
}

# 设置记录
setRecord()
{
writeLog "set domain $3.$8 to new ip:$7"
local subDomain=$3
# 由于*会被扩展,在最后一步将转义的*替换成*
if [ "$subDomain" = '*' ];then
subDomain='*'
fi
local request="&domain_id=$1&record_id=$2&sub_domain=$sub

标签: