找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 25967|回复: 16

完美实现用邮件通知方式告知DD-WRT路由WAN口实时外网IP信息替代动态DDNS

[复制链接]
发表于 2015-6-13 17:44 | 显示全部楼层 |阅读模式
本帖最后由 cedricdai 于 2015-6-14 14:11 编辑

由于需要外网访问家里的DDWRT路由管理界面实现远程开机等相关操作,本来是想用花生壳、3322等动态域名DDNS服务绑定的,但是免费的总归不是太稳定,最近而且老是解析不了,网上逛了几天下来发现有个帖子提到可以通过DDWRT命令中启用自动报告WAN口IP到邮件的想法,但是由于本人非IT专业,不太了解相关语言,文章发表者在文中写的不是太让我理解,按照文中说的也模模糊糊设置了下,报错,无法实现功能,所以,有相关的高手可以帮忙解决吗?下面引用文章中的相关内容如下:文章原地址:http://blog.sina.com.cn/s/blog_544465b00101ag31.html
《DD-WRT上使用的WAN口IP变更,邮件通知》
进入DD-WRT,管理 -> 命令菜单,在文本框输入以下内容,并点击“保存为自定义指令”按钮
以下脚本支持SMTP AUTH,因此需要首先准备邮件账号和密码的base64编码
=`echo -n "test@test.com" | openssl base64`
=`echo -n "12345678" | openssl base64`

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#!/bin/sh

{
echo "HELO DD-WRT";
echo "AUTH LOGIN";
sleep 1;
echo "";
sleep 1;
echo "";
sleep 1;
echo "MAIL FROM:";
echo "RCPT TO:";
echo "DATA";
echo "From: [DD-WRT] ";
echo "To: ";
echo "Date: `date '+%a, %d %b %Y %H:%M:%S %z'`";
echo "Subject: [DD-WRT::Note] Router boot up";
echo "";
echo "The new WANIP is $(ip -4 addr show dev ppp0 | awk '/inet / {print $2}' | cut -d/ -f1).";
echo "";
echo ".";
echo "QUIT";
} | telnet smtp.email.com 25

last=$(nvram get wan_ipaddr)
curr=$(nvram get wan_ipaddr)

while sleep 300s
do
  curr=$(nvram get wan_ipaddr)
  if [ "A$curr" != "A$last" ]; then
{
echo "HELO DD-WRT";
echo "AUTH LOGIN";
sleep 1;
echo "";
sleep 1;
echo "";
sleep 1;
echo "MAIL FROM:";
echo "RCPT TO:";
echo "DATA";
echo "From: [DD-WRT] ";
echo "To: ";
echo "Date: `date '+%a, %d %b %Y %H:%M:%S %z'`";
echo "Subject: [DD-WRT::Note] Router boot up";
echo "";
echo "The new WANIP is $(ip -4 addr show dev ppp0 | awk '/inet / {print $2}' | cut -d/ -f1).";
echo "";
echo ".";
echo "QUIT";
} | telnet smtp.email.com 25
    last=$curr
  fi
done
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
以上脚本提交成功之后,清空文本框内容,输入以下内容,然后点击“保存为启动指令”
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
/tmp/custom.sh &
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

大功告成,路由器启动之后会发送一封邮件到你的邮箱,中间每隔300s检查一次WAANIP是否变动,如果变动,则发送一封邮件告知你新的WANIP。



我自己在DD命令行中输入了些内容,不知道正确与否,请看截图。




是我自己在命令中输入错了么?
我无法理解文章主人在开头写的那段,准备邮箱账号和密码的base64编码,是开头命令在执行么?还是我要先准换好再在命令中输入base64编码呢?









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2015-6-13 17:47 | 显示全部楼层
有没有高手前来解答啊?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2015-6-13 18:15 | 显示全部楼层
急求解答啊,高手呢?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2015-6-14 13:51 | 显示全部楼层
恩山怎么这么冷清,自己琢磨了一天初步想出来如下方案,见下面回复,还有希望高手能帮忙实现定时发送IP地址到邮件的命令,我现在这样只能是邮件地址变更后才通知。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2015-6-14 13:54 | 显示全部楼层
本帖最后由 cedricdai 于 2015-6-14 14:03 编辑

完美实现用邮件通知方式告知DD-WRT路由WAN口实时外网IP信息替代动态DDNS
对于有远程控制需求的同学们,一直受制于使用动态DDNS绑定第三方动态域名的方式来获取对自己想要远程IP地址的访问,比如使用比较流行的花生壳,3322等动态域名,其实他们的原理也就是获取你的外网IP地址和他们的域名直接绑定而已,例如你的路由(我拿路由器举例)WAN口现在的外网地址是118.25.30.55(我随便写的),一般在TPLINK的路由器中会有内置的花生壳绑定服务,你只要填入了相关账号信息,它就可以把你现有的外网IP:118.25.30.55绑定到一个动态域名,比如test.oicp.net(这个是花生壳的一种动态域名方式),如果绑定成功的话,你现在只需要在外网(非你家同一个路由下的内网)的浏览器地址栏输入http:// test.oicp.net,一般即可访问到你的路由器wan口了,如果开了防火墙,设置了相应的端口映射,输入http:// test.oicp.net:端口号,便可访问相关服务了。但是,第三方提供的动态域名绑定免费的总归效率不高,有时候还会无法服务,那通过例如访问http:// test.oicp.net就会报错,达不到自己想要的外网控制的目的。其实换种思路,如果我直接知道了我的WAN口IP地址,不就可以直接输入访问了吗,何必需要中间有这个动态域名绑定解析呢?比如现在直接知道了你的WAN口外网IP:118.25.30.55,你在外网浏览器可以直接输入http:// 118.25.30.55,便可轻松访问到想要访问的内网路由。这里问题就来了,因为私人用户一般很少会有固定的外网IP的,多是随机的动态外网IP,所以,路由的WAN口IP信息会不定时的更新变更,那当你身处在外时,便也无从知晓想要远程的这个外网IP地址信息了。【更多的,大家可以自己百度相关端口映射,DDNS知识,我懂得也只不过是皮毛。】
本文所针对的是使用DD-WRT系统的路由,其他系统的路由我也没有研究过,具体路由怎么刷DD-WRT系统请自行百度相关知识。
对于上面出现的问题,思路是正确的,但是如何才能实时的知道自己的想要远程访问的那个WAN口的IP地址呢?我在逛DD-WRT相关论坛的时候,看到了一篇文章,说想要用DD-WRT系统中的命令发送邮件的方式告知自己路由的WAN口IP地址信息,心想,这是个好办法嘛,可是遍寻了论坛也没有找到切实可用的命令代码,有一个指导性的代码,测试下来也无法实现想要的功能。这里是原帖地址http://blog.sina.com.cn/s/blog_544465b00101ag31.html,原文转载如下:
进入DD-WRT,管理 -> 命令菜单,在文本框输入以下内容,并点击“保存为自定义指令”按钮
以下脚本支持SMTP AUTH,因此需要首先准备邮件账号和密码的base64编码
=`echo -n "test@test.com" | opensslbase64`
=`echo -n "12345678" | opensslbase64`

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#!/bin/sh

{
echo "HELO DD-WRT";
echo "AUTH LOGIN";
sleep 1;
echo "";
sleep 1;
echo "";
sleep 1;
echo "MAIL FROM:";
echo "RCPT TO:";
echo "DATA";
echo "From: [DD-WRT] ";
echo "To: ";
echo "Date: `date '+%a, %d %b %Y %H:%M:%S%z'`";
echo "Subject: [DD-WRT::Note] Router bootup";
echo "";
echo "The new WANIP is $(ip -4 addr showdev ppp0 | awk '/inet / {print $2}' | cut -d/ -f1).";
echo "";
echo ".";
echo "QUIT";
} | telnet smtp.email.com 25

last=$(nvram get wan_ipaddr)
curr=$(nvram get wan_ipaddr)

while sleep 300s
do
  curr=$(nvramget wan_ipaddr)
  if[ "A$curr" != "A$last" ]; then
{
echo "HELO DD-WRT";
echo "AUTH LOGIN";
sleep 1;
echo "";
sleep 1;
echo "";
sleep 1;
echo "MAIL FROM:";
echo "RCPT TO:";
echo "DATA";
echo "From: [DD-WRT] ";
echo "To: ";
echo "Date: `date '+%a, %d %b %Y %H:%M:%S%z'`";
echo "Subject: [DD-WRT::Note] Router bootup";
echo "";
echo "The new WANIP is $(ip -4 addr showdev ppp0 | awk '/inet / {print $2}' | cut -d/ -f1).";
echo "";
echo ".";
echo "QUIT";
} | telnet smtp.email.com 25
    last=$curr
  fi
done

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
以上脚本提交成功之后,清空文本框内容,输入以下内容,然后点击“保存为启动指令”
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
/tmp/custom.sh &
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

大功告成,路由器启动之后会发送一封邮件到你的邮箱,中间每隔300s检查一次WAANIP是否变动,如果变动,则发送一封邮件告知你新的WANIP。

上面这篇文章大致思路有了,但是在具体细节上我还是无法理解(因为本人非IT专业,只是在大学学过C语言,而且很烂,能看懂基本的语言已经是“难能可贵”了)。比如上面写道的先准备好邮箱账号和密码的BASE64码,前两行指令到底是干嘛的?我是一头雾水,后来经过几次三番的测试,查询相关资料,终于晓得了其实这个程序是让DD-WRT系统调用telnet,来利用SMTP协议方式来发送邮件,DD-WRT系统类似于LINUX系统,在WINDOWS系统下利用OUTLOOK发送邮件的方式很像,需要发件人邮箱账号和密码,当然也需要知道这封邮件是发往哪里也就是收件人邮箱账号。搞懂了这个概念,我又从网上找到了相关LINUX调用SMTP发送邮件的相关文章,比如这篇:
文章内如如下:
关于telnet发送smtp邮箱的尝试
之前没有试过这种方式的邮件发送,今天正好碰到一些相关问题,所以研究了一下,遇到了很多问题,最终还是成功了。
完整过程如下,还是很有意思的。
下面的例子是用qq的smtp服务器。 
telnet smtp.qq.com 25220 smtp.qq.com Esmtp QQ Mail Serverhelo sis250 smtp.qq.comauth login334 VXNlcm5hbWU6***
334 UGFzc3dvcmQ6***
235 Authentication successfulmail from: <350510376@qq.com>250 Okrcpt to: <350510376@qq.com>250 Okdata354 End data with <CR><LF>.<CR><LF>to: hellofrom: niansubject: this is a test telnet smtp mailhello,telnet .250 Ok: queued as
做一些说明,可能遇到的问题是
1、首先telnet命令不存在,自己去百度下安装即可,很简单。
2、在和服务器通讯时 helo sis,回车后可能会出现【502 Error:command not implemented】,可以重新输入helo sis,或者helo 其他内容都可以,这边只是打个招呼。
出现上面的错误,多试几次即可,可能是服务器状态比较忙。
3、auth login后需要输入你的qq邮箱的用户名和密码,而且要转换为BASE64编码,随便找个百度应用都有这个功能。如QQ 352000114 用户名对应MzUwNTEwMzc2,
此过程可能也要多做几次,鉴于服务器的状态。
4、输入用户名和密码后出现如下错误【发送邮件错误 454Authentication failed, please open smtp flag first!】,
这个是我纠结了好久的问题,解决方式如下:
在QQ邮箱的设置里面,找到账户-》POP3/IMAP/SMTP选择开启POP3/SMTP服务
5、to: hello  “邮件收件人的名称
from: nian ”邮件来源名称
subject: this is a test telnet smtp mail “主旨

hello,telnet ”内容
6、最后输入点,回车即结束邮件的发送
7、退出连接,可使用命令 quit
    其实,理解下来应该是通过telnet的方式登录DD-WRT路由系统,也就相当于登录到了一个LINUX系统,让它利用SMTP的方式发送邮件。大家也可以自己在WINDOWS系统下启用TELNET功能(如何启用请百度),然后开始-运行-CMD进入,开始尝试用SMTP的方式发送邮件。
在最开始的第一篇文章中的命令代码在有了第二篇的基础上,我理解了问题所在,其实要调用SMTP发邮件,也就要先登录发件的邮箱账号,理所当然的也就要密码了,但是该协议下是要用BASE64编码方式输入登录邮箱账号和密码的,想要获得自己的账号和密码的BASE64编码可以去百度然后有网上自动编码解码的。理解了这个问题,我尝试着在命令行中输入相关指令,可是依然无法接收到邮件,又结合第二篇文章和自己测试下来的telnet方式登录SMTP发送邮件的过程,发现其实在每次输入一个指令后,远程邮件系统其实是会反馈会一段代码的,也就是有一个等待的过程,我在原始指令代码中,又在每条命令后加入了一个“sleep 1;”也就是等待1秒的意思,然后测试下来可以发送邮件了,但是发送后却收不到想要获取的WAN口IP地址信息,真是奇怪了。接下来继续百度查找相关问题,如何让DD-WRT系统获取IP信息,最终找到了其实在源代码中就有这个指令:nvramget wan_ipaddr,第一篇文章中的他用到的获取IP地址代码$(ip -4 addr show dev ppp0 | awk '/inet / {print$2}' | cut -d/ -f1),貌似无法获取到,根据我的渣渣C语言功底,我想这段代码前面的$符号应该是取得后面这个函数具体数值的功能,因此,我将这段替换成了$(nvram get wan_ipaddr)也就是,现在这段代码:echo "The new WANIP is $(nvram getwan_ipaddr).";测试下来,哈哈,终于成功发送了我的WAN口IP地址信息到我的邮件中了!
基本解决问题了,接下来我又在源指令代码中做了一些改动,让系统每隔1分钟就检测一次WAN口IP地址信息:
while sleep 60s
do
  curr=$(nvram get wan_ipaddr)
  if [ "A$curr" !="A$last" ]; then
其实也就是把原代码中的sleep 300s改成了60s(如果觉得频率太高了可以自行修改适当的时间)而已,这段代码的意思也就是:每隔60s比对一下现在WAN口IP地址和最近一次WAN口IP地址,如果不相同的话,那么执行大括号里的一段代码发送最新的WAN口IP地址信息到邮件中了。(我不太会弄循环,不知道怎么设置代码让系统每隔1个小时就发送一次WAN口IP位置信息到邮件,不然就能定时发送最新的IP了,现在这样只能保证WAN口IP变更后才发送邮件)。
我的完整代码如下:
#!/bin/sh

{
sleep 1;    #让程序等待1秒以响应远程邮件服务
echo "HELO DD-WRT"; #与远程邮件服务器打招呼
sleep 1; #让程序等待1秒以响应远程邮件服务
echo "AUTH LOGIN"; #启动SMTP邮件登录服务
sleep 1; #让程序等待1秒以响应远程邮件服务
echo "*****5MjBAMT***"; #这里填入你的发件邮箱账号的BASE64码
sleep 1; #让程序等待1秒以响应远程邮件服务
echo "**ODU3MzE***"; #这里填入你的发件邮箱密码的BASE64码
sleep 1; #让程序等待1秒以响应远程邮件服务
echo "MAIL FROM:<****31920@163.com>"; #这里填入你的发件邮箱账号
sleep 1; #让程序等待1秒以响应远程邮件服务
echo "RCPT TO:<***920@163.com>"; #这里填入你的收件账号
sleep 1; #让程序等待1秒以响应远程邮件服务
echo "DATA";
sleep 1; #让程序等待1秒以响应远程邮件服务
echo "From: [DD-WRT] ";
echo "To: ";
echo "Date: `date '+%a, %d %b %Y %H:%M:%S %z'`";
echo "Subject: [DD-WRT::Note] Router boot up";
echo "";
echo "The new WANIP is $(nvram get wan_ipaddr)."; #获取WAN口IP地址
echo "";
echo ".";
echo "QUIT";
} | telnet smtp.163.com 25 #填入你发件邮箱的SMTP服务地址qq邮箱就是smtp.qq.com 25

last=$(nvram get wan_ipaddr)
curr=$(nvram get wan_ipaddr)

while sleep 60s
do
  curr=$(nvram get wan_ipaddr)
  if [ "A$curr" != "A$last" ]; then
{
sleep 1;
echo "HELO DD-WRT";
sleep 1;
echo "AUTH LOGIN";
sleep 1;
echo "**E5MjBAMTYzL***"; #这里填入你的发件邮箱账号的BASE64码
sleep 1;
echo "***1ODU3Mz***"; #这里填入你的发件邮箱密码的BASE64码
sleep 1;
echo "MAIL FROM:<****920@163.com>";
sleep 1;
echo "RCPT TO:<****920@163.com>";
sleep 1;
echo "DATA";
sleep 1;
echo "From: [DD-WRT] ";
echo "To: ";
echo "Date: `date '+%a, %d %b %Y %H:%M:%S %z'`";
echo "Subject: [DD-WRT::Note] Router boot up";
echo "";
echo "The new WANIP is $(nvram get wan_ipaddr).";
echo "";
echo ".";
echo "QUIT";
} | telnet smtp.163.com 25
    last=$curr
  fi
done
在DD-WRT系统中的管理——命令中的空白文本框中输入上述命令,点击“保存为自定义指令”,这样这段指令就成为了DD-WRT系统命令中的自定义脚本命令了,其他程序就可以来调用执行,因此,需要一个开机就执行的命令,在空白文本框中继续输入如下代码:
/tmp/custom.sh &
点击“保存为启动命令”
然后可以试着点击“运行命令”,如果没问题的话,你的收件邮箱中应该收到了邮件信息了吧,新的WAN口IP信息已经被你获得了,接下来,看你自己的需要进行操作了。
完成后在DD-WRT系统中的命令截图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-7-4 21:37 | 显示全部楼层
好强大,楼主辛苦了,支持
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2015-7-4 22:39 来自手机 | 显示全部楼层
楼主牛皮的很
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-3-20 09:04 | 显示全部楼层
我也想知道,非常感谢
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-3-28 23:18 | 显示全部楼层
厉害 ,收藏下
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-4-26 19:23 来自手机 | 显示全部楼层
学习了 会去尝试一下
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-9-12 23:11 | 显示全部楼层
last=$curr

这句 非常重要
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-9-13 09:00 | 显示全部楼层
签到!谢谢
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-9-13 14:18 | 显示全部楼层

666666支持看看
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-9-17 08:07 来自手机 | 显示全部楼层
这么说中继的就没法搞了?因为wan口都是内网ip
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-10-8 10:13 | 显示全部楼层
好东西 谢谢
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-19 15:21

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表