家里的公网 IP 地址有时会变化,这使得我的某些依赖域名的服务(网站, VPN , rsync 备份等)随之陷入瘫痪。原来我是在我的路由器上用免费的 DDNS 功能,但这种免费服务一般不能使用自己的域名,又或者必须将域名迁移到 DDNS 的服务商那里。总之很是不爽。
在 V2EX 看到很多人推荐,我把域名也转到了 Namesilo 。 (拜拜了,狗带!) Namesilo 不仅价格合理,而且我发现竟然还有 API 接口支持!惊喜之后上网搜索有关 Namesilo 的 DDNS 方案,不料大失所望!只发现有在 WINDOWS 的 POWERSHELL 下的一个方案。
好吧,那就自己动手解决吧。
#!/bin/bash
##Domain name:
DOMAIN="mydomain.tld"
##Host name.
##If you want manage host "myhost.mydomain.tld", then
HOST="myhost"
##APIKEY obtained from Namesilo:
APIKEY="c40031261ee449037a4b4"
##Saved history pubic IP from last check
IP_FILE="/var/log/MyPubIP"
##Get the current public IP
CUR_IP=$(curl -s http://icanhazip.com)
##Exit if curl failed
if [ $? -ne 0 ]; then
exit 1
fi
##Check file for previous IP address
if [ -f $IP_FILE ]; then
KNOWN_IP=$(cat $IP_FILE)
else
KNOWN_IP=
fi
##See if the IP has changed
if [ "$CUR_IP" != "$KNOWN_IP" ]; then
echo $CUR_IP > $IP_FILE
logger -t IP.Check -- Public IP changed to $CUR_IP
##Update DNS record in Namesilo:
curl -s "https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=$APIKEY&domain=$DOMAIN" > $DOMAIN.xml
RECORD_ID=`xmllint --xpath "//namesilo/reply/resource_record/record_id[../host/text() = '$HOST.$DOMAIN' ]" $DOMAIN.xml | grep -oP '(?<=<record_id>).*?(?=</record_id>)'`
curl -s "https://www.namesilo.com/api/dnsUpdateRecord?version=1&type=xml&key=$APIKEY&domain=$DOMAIN&rrid=$RECORD_ID&rrhost=$HOST&rrvalue=$CUR_IP&rrttl=7207"
else
logger -t IP.Check -- NO IP change
fi
exit 0
1
kuxiazi 2016-04-26 06:30:45 +08:00 via Android
域名在 dnspod 解析的 就用的 dnspod
|
4
Tink 2016-04-26 07:44:20 +08:00 via iPhone
这样解析不慢吗?
|
5
c3538378 2016-04-26 07:59:22 +08:00
大哥, DDNS provider 不提供自己的域名是吧?你 cname 一下不就完事了!
|
6
kuxiazi 2016-04-26 08:06:07 +08:00 via Android
@c3538378 之前我就是这样用花生壳的 后来换的路由器固件自带 dnspod 的脚本 就直接用了 反正域名也在那
|
7
miaomiao888 2016-04-26 08:21:43 +08:00
用 changeip.com 的可以,然后用自己的域名 CNAME 一下 OK ,秒解析
|
8
mjever 2016-04-26 08:50:13 +08:00
namecheap 的 DDNS 免费还支持自己的域名,用了很久了!
|
9
dynaguy OP 楼上各位用 CNAME 的,那不是多了一层解析吗?
|
10
EPr2hh6LADQWqRVH 2016-04-26 11:15:14 +08:00
|
11
dynaguy OP @miaomiao888 既然 changeip 的 DDNS 服务是免费的,竟然还要信用卡信息,呵呵了!
|
12
cxh116 2016-04-26 11:34:56 +08:00
dnspod 有接口,目前自己是用 dnspod 的接口每小时更新一下. 直接用 wget 命令
需要提前调用接口获取到 domain_id record_id wget -O /tmp/ddns.log --post-data 'login_token=id,token&format=json&domain_id=111&record_id=111&record_line=默认&sub_domain=openwrt' https://dnsapi.cn/Record.Ddns |
13
lwd2136 2016-11-29 23:20:20 +08:00
一直错误 108...
|
14
dynaguy OP |
15
lwd2136 2016-11-30 09:05:31 +08:00
@dynaguy 隐去了些特定信息
+ DOMAIN=abc.com + HOST=edgeos + APIKEY=123 + IP_FILE=/var/log/MyPubIP + RESPONSE=/tmp/namesilo_response.xml ++ curl -s http://icanhazip.com + CUR_IP=223.5.5.5 + '[' 0 -ne 0 ']' + '[' -f /var/log/MyPubIP ']' + KNOWN_IP= + '[' 223.5.5.5 '!=' '' ']' + echo 223.5.5.5 + logger -t IP.Check -- Public IP changed to 223.5.5.5 + curl -s 'https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=a123&domain=abc.com' ++ xmllint --xpath '//namesilo/reply/resource_record/record_id[../host/text() = '\''edgeos.abc.com'\'' ]' abc.com.xml ++ grep -o '(?<=<record_id>).*?(?=</record_id>)' + RECORD_ID= + curl -s 'https://www.namesilo.com/api/dnsUpdateRecord?version="" ++ xmllint --xpath '//namesilo/reply/code/text()' /tmp/namesilo_response.xml + RESPONSE_CODE=108 + case $RESPONSE_CODE in + logger -t IP.Check -- DDNS update 'failed!' + exit 0 |
16
dynaguy OP @lwd2136
貌似你在第一个 curl 没有拿到 RECORD_ID. 你有 + curl -s 'https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=a123&domain=abc.com' 这里为啥 key=a123, 而前面 APIKEY=123 |
17
lwd2136 2016-11-30 15:35:39 +08:00
@dynaguy 后面那个是一致的,我只是抹掉 apikey 没抹干净
我也看到似乎是 record_ID 没有拿到 但是没有搞定怎么解决 |
18
dynaguy OP @lwd2136
那你手动运行一下那个 curl 命令,看看有没有拿到 xml 文件反馈: curl -s 'https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=a123&domain=abc.com' 将 key 和 domain 替换成你自己的。 如果你没有得到 xml 文件,那你的APIKEY有问题。 |
19
dynaguy OP 像这样(只贴了开头一小部分):
curl "https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=441ff78e1271520db34e2&domain=pztop.com" <?xml version="1.0"?> <namesilo><request><operation>dnsListRecords</operation><ip>205.205.98.198</ip></request><reply><code>300</code><detail>success</detail><resource_record><record_id>145fadda5adefaf71fb082ddbab7c568</record_id>.... |
22
Remember 2018-01-17 02:51:49 +08:00
域名不在 namesilo 可以用他家解析服务吗
|