前言
最近一直在用dynv6.com提供的dynv6.sh来结合crontab定时更新dynv6的DDNS动态解析。但是突然有一天路由器重启后脚本不见了,之前的设置资料没有保留。没办法需要重新弄,就继续网上搜索,突然看见这位博主的文章「捯饬记录」配置一下Padavan的IPV6动态域名解析,发现原来padavan自带发邮件的sendmail程序,就比葫芦画瓢自己也弄一个。
效果图
脚本代码
这里直接借鉴了这位大佬(whatGUI)的代码。将电子邮件美化了一下。最终结果如下:
#!/bin/bash -e
#./dynv6.sh [mode] [hostname] [name] [mac] # mode: router or neigh
token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
mode=$1
hostname=$2
name=${3:-'router'}
mac=$4
device=ppp0
if [ "$mode" != "router" -a "$mode" != "neigh" ]; then
echo "please select router or neigh"
exit
fi
if [ "$mode" = "neigh" ]; then
if [ -z $mac ]; then
echo "mac is empty"
exit
fi
mac=$( echo $mac | tr '[A-Z]' '[a-z]' )
file=$HOME/.dynv6.neigh.$name
[ -e $file ] && old=`cat $file`
macinf=$(echo $mac | awk -F ':' '{print $5$6}' )
ipaddress=$(ip -6 neighbor | grep $mac | grep -v $macinf | grep -v 'fe80' | sed -n 1,1p | awk '{print $1}')
else
file=$HOME/.dynv6.router
[ -e $file ] && old=`cat $file`
ipaddress=$(ip -6 addr list scope global $device | grep "global" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p')
fi
echo old ip is : $old
echo new ip is : $ipaddress
if [ -z "$ipaddress" ]; then
echo "no IPv6 address found"
exit 1
fi
if [ "$old" = "$ipaddress" ]; then
echo "IPv6 address unchanged"
exit
fi
echo $ipaddress > $file
curl -s -S -f -k "https://dynv6.com/api/update?hostname=$hostname&ipv6=$ipaddress&token=$token"
if [ "$mode" = "router" ]; then
curl -s -S -f -k "https://ipv4.dynv6.com/api/update?hostname=$hostname&ipv4=auto&token=$token"
fi
logger 监测到设备 $name 的IPv6变更,地址为$ipaddress, dynv6 DDNS已完成同步
smtpserver=smtp.qq.com
[email protected]
fromaddresspwd=xxxxxxxxxxxxxxxx
[email protected]
mailtxt=$HOME/.mail.$name
sdate=`date +%Y年%m月%d日%H:%M:%S`
cat > $mailtxt <<EOF
To: ${toaddress}
From: =?UTF-8?B?`echo -n 家中的路由| base64`?= <${fromaddress}>
Subject: =?UTF-8?B?`echo -n 您的设备 ${name} 检测到新的IP啦!| base64`?=
MIME-VERSION: 1.0
Content-type: text/html;charset=UTF-8
<style>
.wrap span{display: inline-block;}
.w260{width: 260px;}
</style>
<table style="width: 99.8%;height:99.8% vertical-align: top;"><tbody><tr><td>
<div style="border-radius: 10px 10px 10px 10px;font-size:13px;color: #555555;width: 666px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB',微软雅黑,'Microsoft Yahei',Tahoma,Helvetica,Arial,'SimSun',sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%;background: #ffffff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.25);">
<div style="width:100%;background:#49BDAD;color:#ffffff;border-radius: 10px 10px 0 0;background-image: -moz-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));background-image: -webkit-linear-gradient(0deg, rgb(67, 198, 184), rgb(255, 209, 244));height: 66px;">
<p style="font-size:15px;word-break:break-all;padding: 23px 32px;margin:0;background-color: hsla(0,0%,100%,.4);border-radius: 10px 10px 0 0;">您的家用路由器上的设备 ${name} 检测到新的IP啦!
</p>
</div>
<div style="margin:40px auto;width:90%">
<p>系统在您的${name}设备上检测到新的IPv6地址:</p>
<p style="background: #fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);margin:20px 0px;padding:15px;border-radius:5px;font-size:14px;color:#555555;">${ipaddress}</p>
<p class="wrap" style="text-decoration:none"><span class="w260">更新时间:${sdate}</span></p>
<p class="wrap" style="text-decoration:none"><span class="w260">DDNS域名:${hostname}</span></p>
</div>
</div>
</td></tr></tbody></table>
EOF
sendmail -v -w 30 -f $fromaddress -t $toaddress -H "openssl s_client -quiet -connect $smtpserver:465" -au$fromaddress -ap$fromaddresspwd < $mailtxt
使用方法
使用方法和大佬提供的一样,不过我这个既更新DDNS,也发送邮件。
参数格式说明:./dynv6.sh [模式] [域名] [设备名] [MAC地址]
1.将上述代码保存为一个文件名为dynv6.sh的文本文件,务必填写dynv6的token信息和SMTP的配置信息。
2.使用scp命令拷贝到路由器中的/etc/storage目录下。
3.用ssh连接到路由器,对脚本文件添加可执行权限。
cd /etc/storage
chmod +x dynv6.sh
4.使用crontab -e
命令,编辑定时表,定时执行。
#添加需要进行 DDNS 的设备,每 10 分钟自动执行一次检查。注意!把命令中的域名改为你的域名,比如 xxxx.dynv6.net,设备名自定但必须是英文否则会出错,MAC 地址要求按照带有冒号分隔符的格式,例如11:22:33:aa:bb:cc
#可以更新路由器的IPv6和IPv4地址DDNS解析,并发送邮件。
*/10 * * * * /etc/storage/dynv6.sh router 域名
#可根据mac地址更新路由器下级设备的IPv6地址的DDNS解析,并发送邮件。
*/10 * * * * /etc/storage/dynv6.sh neigh 域名 设备名 MAC地址
#可以添加多个设备,每一行对应一个设备
#举例如下
#*/10 * * * * /etc/storage/dynv6.sh router xxxx.dynv6.net
#*/10 * * * * /etc/storage/dynv6.sh neigh yyyy.dynv6.net phone 11:22:33:aa:bb:cc
遇到的坑
1.notepad--的行尾换行符bug
我使用的是debian提供的notepad--/now 2.0.0 mips64el,复制完大佬的代码后,粘贴完成后,选择行尾代码为LF。结果上传到路由器上后,就报错syntax error: unexpected "then" (expecting "fi")
。又是换bash,又是换sh,找了半天也没有找到问题。后来换Kate编辑器后重新保存一遍,好了。
2.空格字符问题
复制大佬的代码后,运行提示找不到awk,我根据kate编辑器的显示,发现有奇怪的空格字符,如下图,删了,好了。
3.多个IPv6地址的问题
用大佬的代码更新DDNS时,报错,说URL错误,跟踪了下,发现$ipaddress变量里存了两个地址。原来的代码看来下逻辑,是默认去除掉fe80开头的和mac地址5、6位拼接的这俩IPv6地址。结果我的PC没有mac地址5、6位拼接的这个地址,具体原因未知。没办法,只能取第一行的了,代码由下图改为这样
ipaddress=$(ip -6 neighbor | grep $mac | grep -v $macinf | grep -v 'fe80' | sed -n 1,1p | awk '{print $1}')
4.sendmail发送465端口报错或卡住的问题
我使用的是qq邮箱,发现大佬给的代码报错,加了465端口会卡住,最后改为如下代码。其中-quiet
必须加,不加就报错。
sendmail -v -w 30 -f $fromaddress -t $toaddress -H "openssl s_client -quiet -connect $smtpserver:465" -au$fromaddress -ap$fromaddresspwd < $mailtxt
5.邮件正文格式的问题
用大佬给的代码,发现发送过去,确实有标题,有内容,但是手机的邮件客户端接收后,看不到正文。经过研究发现在标题和下方邮件正文部分,必须间隔一个空行。没有这个空行就会出现这个问题。
6.邮件标题乱码和发件人名称
测试yandex提供的域名邮箱时,发现无法正常显示邮件标题,经搜索查看这篇文章介绍的方法,采用base64编码的方式解决,但是实际使用
在中文的左边加 =?UTF-8?B?`echo ,右边加 | base64`?=
后,发现邮件标题正常显示,但发件人结尾会带个n。经过分析,发现是echo会带个回车符,改用echo -n
就好了。
看了博主的文章我才知道padavan自带发送通知邮件
DeepRouter 26 天前