参考文献:
1.免费好用的IPv6之DDNS服务-Openwrt上dynv6的使用介绍
2.定时任务初体验
3.crontab执行时间计算 - 在线工具
4.Mac下使用crontab定时任务,示例及详细说明
使用ipv6做DDNS的前提是,https://www.test-ipv6.com的公网的ipv6地址跟自己机器的ipv6相同。
这里使用https://dynv6.com的免费DDNS
注册dynv6的时候需要翻墙,因为它使用了Google的非机器人验证
可以手动修改IP,也可以通过API修改
以下代码,修改了官方的脚本(适用于macOS)文件名(dynv6.sh
)存放在$HOME目录下,需要可执行权限如:chmod 777 dynv6.sh
#!/bin/sh -e
source /etc/profile #读取环境变量,如果没写,没法读取$HOME的值!
hostname=$1
device=$2
file=$HOME/.dynv6.addr6
[ -e $file ] && old=`cat $file`
if [ -z "$hostname" -o -z "$token" ]; then
echo "Usage: token=<your-authentication-token> [netmask=64] $0 your-name.dynv6.net [device]"
exit 1
fi
if [ -z "$netmask" ]; then
netmask=128
fi
if [ -n "$device" ]; then
device="dev $device"
fi
#address=$(ip -6 addr list scope global $device | grep -v " fd" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p' | head -n 1) #linux
address=$(ifconfig | grep inet | grep "autoconf temporary" | sed -E -n 's/.*inet6 ([0-9a-f:]+).*/\1/p' | head -n 1) #for mac
if [ -e /usr/bin/curl ]; then
bin="curl -fsS"
elif [ -e /usr/bin/wget ]; then
bin="wget -O-"
else
echo "neither curl nor wget found"
exit 1
fi
if [ -z "$address" ]; then
echo "no IPv6 address found"
exit 1
fi
# address with netmask
current=$address/$netmask
if [ "$old" = "$current" ]; then
echo "IPv6 address unchanged"
exit
fi
# send addresses to dynv6
$bin "http://dynv6.com/api/update?hostname=$hostname&ipv6=$current&token=$token"
#$bin "http://ipv4.dynv6.com/api/update?hostname=$hostname&ipv4=auto&token=$token" #不需要ipv4所以注释了
# save current address
echo $current > $file
使用crontab来实现定时任务
crontab -e //编辑crontab任务,保存退出后自动加到crontab列表中执行
crontab -l //查看所有crontab 列表
crontab -e
然后添加:* * * * * token=8*******************H /Users/userName/dynv6.sh example.dynv6.net
这个测试用* * * * * /bin/date >> /Users/userName/Desktop/cron.txt
,看cron是否可用,如果有日期写入这个文件就是cron正常可用
注意清理系统用户的邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户
邮件在/var/mail/username
修改* * * * * token=8*******************H /Users/userName/dynv6.sh example.dynv6.net
为* * * * * token=8*******************H /Users/userName/dynv6.sh example.dynv6.net >/dev/null 2>&1
“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
如果配置完成后,但仍旧不能从外网访问路由器,可能有以下几种原因:
- 运营商分配了IPv6,但禁止了传入连接(罕见,多见于教育网、机关单位等统一配置的防火墙,个人无法解决)
- 光猫拨号,向下级设备分配了IPv6地址,但光猫的防火墙禁止了传入连接(较常见,可通过修改光猫配置关闭防火墙或改为桥接模式、路由器拨号)
- 运营商禁用了常用端口80、443、8080等(常见,修改http服务器的端口再次测试即可,参考:https://blog.csdn.net/weixin_43593122/article/details/95766357)