|
本帖最后由 liaohcai 于 2023-1-29 16:06 编辑
一、背景:
自从小孩学会了使用电脑后,家长想知道小孩半夜有没有起来玩电脑,或者是家长不家,小孩在该写作业的时候看电视,在家长回来时关掉。
或者想知道某个设备的连网情况,中间过程有没有断开。
或者想查看家人什么时间回家和出去的记录,因为根本上人手一部手机,在家会自动连上wifi。
二、前言:
我的主路由是CR6609,已经刷好了openwrt (固件版本OpenWrt 01.08.2023 by Kiddin' / LuCI Master git-264dc3c)是正常安装插件的固件。于是我找遍了整个国内大内网,找不到类似监控连网记录功能的插件。要实现类似功能需要买有行为监控的企业级路由器,用软路由安装爱快。
我本身不是程序员,但我是openwrt 和padavan爱好者(自己从没编译过固体),学过一些shell 脚本语言。
利用春节这几天,自己试着编写一则在线离线记录脚本,再经过两天的调试,脚本能正常运行,记录。
三、原理:
方法一是,利用路由器每隔一时间去ping目标设备ip地址,如果ping通了表示设备在线,并记录时刻 和“在线”状态,否则为“离线”状态。(非常准)
方法二是,利用路由器的“ip -4 nei | grep REACHABLE”每隔一时间查找对应的mac和ip的活动状态(reachable | stale),如果是reachable表示设备在线,并记录时刻 和“在线”状态,否则为“离线”状态。(不那么准,设备连上网了,但它不活动,就被标记为stale)
方法三是,利用路由器的arp缓存,每隔一时间查找对应的mac和ip的在线(0x2)和不在线(0x0)状态, 如果是reachable表示设备在线,并记录时刻 和“在线”状态,否则为“离线”状态。(较准,arp缓存存在一段时间,设备离线要等上一两分钟才能标记为0x0,可以接受,对于一些设备禁用了ping只能用此方法。)
四、经历:
第一个版本,生成的记录是每分钟记录一次,经过一段时间后,生成的记录文件变得非常巨大,打开慢,不利查看。
第二个版本,合并连续的“在线”为一个时间记录和连续的”离线“为一个时间记录。
第三个版本,增加了时长记录,这一版本用了我两天的时间调试,已经能正常记录
这是第三个版本的脚本:
- #!/bin/sh
- ########################
- ########################
- ip=192.168.3.12
- ##填写要监控的ip地址
- onlinelog="/tmp/L台式电脑在线记录.log"
- ##填写保存目录文件名。“/tmp”是临时目录,路由器关机或重启里面的文件不保存,它是映射在运存中,频繁读写的文件最好是保存在“/tmp中”。
- ########################
- ########################
- p=`echo $ip | tr . _`
- d=`date +%F' '%X `
- #############################
- f=`find $onlinelog`
- if [ "$f" != "$onlinelog" ] ;then
- echo "这是名为L的台式电脑连接CR6609路由器的连网记录,间接了解电脑的开机和关机时间或时长" >> $onlinelog
- echo [$d] "这是脚本开始运行时间,下一行才是设备的状态" >> $onlinelog
- exit
- fi
- ##因为用到两个日期计算需要一个开始日期,否则报错。
- #############################
- t1=`echo $d`
- t2=`echo $(cat $onlinelog |tail -n 1 | cut -d[ -f2 | cut -d] -f1)`
- long=$(($(date +%s -d "$t1") - $(date +%s -d "$t2")))
- hour=$(( $long/3600))
- min=$(( ($long-${hour}*3600)/60 ))
- sec=$(( $long-${hour}*3600-${min}*60))
- HMS=`echo ${hour}小时${min}分${sec}秒`
- a=`ping $ip -c 2 -A`
- b=`echo $a |grep -o "100%" `
- if [ "$b" == "100%" ] ;then
- old=$(tail -n 1 $onlinelog)
- if [ "离线" == "$(echo $old | grep -o "离线")" ] ; then
- exit
- else
- echo [$d] "离线" "(连网时长:${HMS})" >> $onlinelog
- fi
- else
- old=$(tail -n 1 $onlinelog)
- if [ "在线" == "$(echo $old | grep -o "在线")" ] ; then
- exit
- else
- echo [$d] "在线" "(断网时长:${HMS})" >> $onlinelog
- fi
- fi
- exit
复制代码
这是生成的记录:
五、食用:
在win 10上用winSCP登录openwrt后台,将脚本上传到“/etc”目录中,双击打开编辑脚本,填写你要监控的ip和生成记录的文件名。然后在用浏览器登录 openwrt,在系统-计划任务中以下代码:
- */1 * * * * sh /etc/脚本名.txt
复制代码 保存!可以按此方法添加多个。
经过一段时间后再用winSCP 登录openwrt后台在“/tmp”打开生成的记录文件。
如果文件名是中文有可能是乱码,需要在winSCP的登录设置:开启文件名UTF-8编码
或者用SSH终端查看
手机可以用JuiceSSH查看
六、后记
如果觉得用,请回复
最后附上脚本文件
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|