家里的公网 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 