家里申请了公网 IP, 然后路由器暴露一些服务到外网, 虽然有用了公云的 DDNS, 但是不能做一些子域名的映射, 有诸多限制, 所以在 namesilo 上注册了一个个人域名, 用来访问内网的一些服务.

但是 K3 路由器没有 namesilo 的动态域名插件, 所以自己结合了网上的一些脚本, 制定了一个自己的 DDNS 更新脚本.

网上的脚本基本都是通 curl 一些外网 API 来获取公网 IP 的, 因为我是直接在路由器上面使用, 所以可以通过 ifconfig 来获取公网 IP. 以下是脚本内容:

脚本

#!/bin/sh

IPDIR="$(cd "$(dirname "$0")";pwd)/IP" # store last ip in script folder
APIKEY="your_api_key"
DOMAIN="your_domain" # world.com
HOST="your_host" # hello
IP="$(ifconfig | sed -n "s/.*:\(.*\)P-t-P.*/\1/p")" # get public ip by ifconfig
API='https://www.namesilo.com/api'

if [ -f $IPDIR ]; then
  LASTIP="$(cat $IPDIR)"
else
  LASTIP="0.0.0.0"
fi

if [[ "$IP" != "$LASTIP" ]]; then
  echo $IP > $IPDIR

  if [ -z "$HOST" ]; then
    FULLDOMAIN=$DOMAIN
  else
    FULLDOMAIN="\\$HOST.$DOMAIN"
  fi

  # Fetch DNS record ID
  RESPONSE="$(curl -s --insecure "$API/dnsListRecords?version=1&type=xml&key=$APIKEY&domain=$DOMAIN")"
  RECORD_ID="$(echo $RESPONSE | sed -n "s/^.*<record_id>\(.*\)<\/record_id>.*<host>$FULLDOMAIN<\/host>.*$/\1/p")"

  # Update DNS record in Namesilo
  RESPONSE="$(curl -s --insecure "$API/dnsUpdateRecord?version=1&type=xml&key=$APIKEY&domain=$DOMAIN&rrid=$RECORD_ID&rrhost=$HOST&rrvalue=$IP&rrttl=3600")"

  # Check whether the update was successful
  echo $RESPONSE | grep -E "<code>(280|300)</code>" &>/dev/null

  if [ $? -eq 0 ]; then
    echo 'IP Update Success!'
  else
    echo 'IP Update Failed!'
  fi

else
  echo 'IP Not Need Update!'
fi

定时更新

*/5 * * * * /your_path_to_script/your_script_name.sh # every five minutes

笔记      码农 折腾

自由转载-非商用-禁止演绎-保持署名 (CC BY-NC-ND 4.0)