OpenWrt断网自动重拨

OpenWrt断网自动重拨

分享到:

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,密码这里输入路由器的管理员密码。点击登录。

WinSCP登录OpenWrt路由器
C.将密钥添加到缓存中。

在弹出的对话框中选是。

将密钥添加到缓存中
D.上传脚本到root目录。

直接将脚本文件拖到右边的窗口就可以上传了。

将脚本上传到root目录下
E.修改脚本文件权限为0777或者0755。

选中脚本文件,右键单击属性。选中拥有者、组和其他的读写和执行权限就是0777,去掉组和其他的写的权限就是0755。0755的权限就够了。

设置脚本文件权限

2. 测试脚本是否有效。

A. 登录OpenWrt路由器后台,网络-接口-WAN-关闭。
关闭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分钟执行一次,那么设置两分钟后才能看到日志文件。

检查是否有日志文件生成

欢迎您使用我的教程,赞赏随缘随意,无需介怀您对此没有付出任何经济上的贡献。如果您转载的话,麻烦您注明一下出处。因为一篇图文并茂的文章写下来,差不多要一到三个小时。感谢您对我劳动的尊重。

微信赞赏

支付宝赞赏

Comments are closed.