OpenWrt路由器在光猫断电之后,不能自动重新拨号获取IP,网上搜索了一下,发现大神 朱君绰绰 已经写了脚本,就不重复造轮子了。可能对于小白而言,实现起来还是有点难。于是就有了这个教程。
脚本如下,记得复制到记事本,另存为my_pppoe.sh。
#!/bin/sh #网络检测脚本 通过PING来判断网络互通状态 #by:朱君绰绰 V1.5 #shell测试命令 #./my_pppoe.sh runA #计划任务命令 #*/5 * * * * /root/my_pppoe.sh runA >> /root/my_pppoe.log 2>&1 #状态解释(State) # Carry Out=执行脚本 # Create Log=创建日志文件 # Clear Log = 清空日志内容 # Log Byte 123/456=日志文件大小 # Ping 8.8.8.8=ping # Ping 8.8.8.8 Yes=ping正常 # Ping 8.8.8.8 No=ping异常 # Ping Retry 1/3=ping重试 # Restart Wan=重连wan # Restart Wan Yes=重连wan完成 # Restart Network=重启网络进程 # Restart Network Yes=重启网络进程完成 # Restart Reboot=重启路由器 # Restart Reboot Yes=已发送重启路由器命令 #相关变量解释 # LogMax=日志大小(KB) # LogFile=日志文件 # PingA,PingB=IP地址 # CycleIndex=重试次数 # IntervalTime=重试间隔时间(秒) function NowTimeCall() { NowTime=$(date "+%Y-%m-%d %H:%M:%S") } function LogTextCall() { if [ ! -f "$1" ]; then echo "$NowTime - State:Create Log" else Size=`ls -l $1 | awk '{ print $5 }'` Max=$((1024*$2)) if [ $Size -ge $Max ]; then cat /dev/null > $1 echo "$NowTime - State:Clear Log" else echo "$NowTime - State:Log Byte $Size/$Max" fi fi } #NowTime=$(date "+%Y-%m-%d %H:%M:%S") NowTimeCall echo "<my_pppoe> ----------------------------------------------" echo "$NowTime - State:Carry Out" LogMax=512 LogFile="/root/my_pppoe.log" PingA=114.114.114.114 PingB=202.108.22.5 CycleIndex=3 IntervalTime=10 LogTextCall $LogFile $LogMax i=0 PingError=0 while [[ $i -lt $CycleIndex ]] do NowTimeCall echo "$NowTime - State:Ping $PingA" if /bin/ping -c 1 $PingA >/dev/null then NowTimeCall echo "$NowTime - State:Ping $PingA Yes" PingError=0 break else NowTimeCall echo "$NowTime - State:Ping $PingA No" NowTimeCall echo "$NowTime - State:Ping $PingB" if /bin/ping -c 1 $PingB >/dev/null then NowTimeCall echo "$NowTime - State:Ping $PingB Yes" PingError=0 break else NowTimeCall echo "$NowTime - State:Ping $PingB No" i=$(($i + 1)) echo "$NowTime - State:Ping Retry $i/$CycleIndex" PingError=1 sleep $IntervalTime fi fi done if [ $PingError = 1 ]; then if [ $1 = runA ]; then NowTimeCall echo "$NowTime - State:Restart Wan" ifup wan NowTimeCall echo "$NowTime - State:Restart Wan Yes" fi if [ $1 = runB ]; then NowTimeCall echo "$NowTime - State:Restart Network" /etc/init.d/network restart NowTimeCall echo "$NowTime - State:Restart Network Yes" fi if [ $1 = runC ]; then NowTimeCall echo "$NowTime - State:Restart Reboot" echo "$NowTime - State:Restart Reboot Yes" reboot fi fi exit 0
具体步骤如下:
1. 上传脚本到root目录并修改权限。
A. 下载WinSCP,安装。
B.设置登录信息。
打开WinSCP, 文件协议选SCP,主机名输入路由器IP地址,端口号如果没有改过,默认的就可以。用户名这里输入路由器的登录用户名,也就是管理员ID,密码这里输入路由器的管理员密码。点击登录。
C.将密钥添加到缓存中。
在弹出的对话框中选是。
D.上传脚本到root目录。
直接将脚本文件拖到右边的窗口就可以上传了。
E.修改脚本文件权限为0777或者0755。
选中脚本文件,右键单击属性。选中拥有者、组和其他的读写和执行权限就是0777,去掉组和其他的写的权限就是0755。0755的权限就够了。
2. 测试脚本是否有效。
A. 登录OpenWrt路由器后台,网络-接口-WAN-关闭。
B. WinSCP中点击打开终端,执行以下测试代码:
./my_pppoe.sh runA
C. 代码执行完之后可以看到网络连接已经恢复。
3. 设定计划任务。
A. 系统->计划任务,添加下列命令中的一条,按需设置。
注意命令首尾无空格
1分钟执行一次,异常重启wan
*/1 * * * * /root/my_pppoe.sh runA >> /root/my_pppoe.log 2>&1
2分钟执行一次,异常重启wan
*/2 * * * * /root/my_pppoe.sh runA >> /root/my_pppoe.log 2>&1
5分钟执行一次,异常重启wan
*/5 * * * * /root/my_pppoe.sh runA >> /root/my_pppoe.log 2>&1
5分钟执行一次,异常重启网络连接
*/5 * * * * /root/my_pppoe.sh runB >> /root/my_pppoe.log 2>&1
5分钟执行一次,异常重启路由器
*/5 * * * * /root/my_pppoe.sh runC >> /root/my_pppoe.log 2>&1
runA=重启WAN(极力推荐),支持1-30分钟
runB =重启网络连接(不推荐),支持5-30分钟,最少需要5分钟(设置太短可能无法进入路由器后台)
runC =重启路由(不推荐),支持5-30分钟,最少需要5分钟(设置太短可能无法进入路由器后台)
这里我设置的是2分钟执行一次,异常重启WAN。
*/2 * * * * /root/my_pppoe.sh runA >> /root/my_pppoe.log 2>&1
B. 检查计划任务是否成功执行脚本。
WinSCP登录到路由器root目录看看是否有日志文件。需要注意的是,如果设置的执行时间比较久,需要等一会才能看到日志文件。比如说设置的是2分钟执行一次,那么设置两分钟后才能看到日志文件。
欢迎您使用我的教程,赞赏随缘随意,无需介怀您对此没有付出任何经济上的贡献。如果您转载的话,麻烦您注明一下出处。因为一篇图文并茂的文章写下来,差不多要一到三个小时。感谢您对我劳动的尊重。