如何实现ping检测网络失败后自动通过telnet重启调制解调器的bash脚本
实现方案
核心思路
在现有expect逻辑外层套一层Bash检测逻辑,先对公网稳定地址执行ping连通性测试,所有ping包都丢失的情况下再执行调制解调器重启逻辑。
方案1:单文件整合版(推荐,只需维护一个脚本)
把expect逻辑直接嵌入Bash脚本中,创建名为modem_check_reboot.sh的文件,内容如下:
#!/bin/bash # 配置项,请根据实际情况修改 PING_TARGET="114.114.114.114" # 公网ping目标,可选223.5.5.5等稳定公网地址 PING_COUNT=3 # ping测试次数 MODEM_IP="192.168.1.1" # 调制解调器管理地址 TELNET_USER="xxxxx" # telnet登录用户名 TELNET_PASS="xxxxx" # telnet登录密码 # 执行ping检测,丢弃输出仅判断返回值 ping -c $PING_COUNT -W 1 $PING_TARGET > /dev/null 2>&1 # ping返回值非0表示检测失败,执行重启逻辑 if [ $? -ne 0 ]; then # 内嵌expect执行telnet重启操作 expect << EOF set timeout 60 spawn /usr/bin/telnet $MODEM_IP expect "Username:" {send "$TELNET_USER\r"} expect "Password:" {send "$TELNET_PASS\r"} expect "*" {send "reboot\r"} interact EOF fi
执行前先给脚本加执行权限:chmod +x modem_check_reboot.sh
方案2:双文件拆分版
如果你想把检测逻辑和重启逻辑分开维护,可以拆成两个文件:
- 先把你现有的重启逻辑保存为
modem_reboot.exp,内容如下:
set timeout 60 set user xxxxx set password xxxxx spawn /usr/bin/telnet 192.168.1.1 expect "Username:" {send "$user\r"} expect "Password:" {send "$password\r"} expect "*" {send "reboot\r"} interact
给文件加执行权限:chmod +x modem_reboot.exp
- 再创建Bash检测脚本
modem_check.sh,内容如下:
#!/bin/bash PING_TARGET="114.114.114.114" PING_COUNT=3 ping -c $PING_COUNT -W 1 $PING_TARGET > /dev/null 2>&1 if [ $? -ne 0 ]; then # 调用独立的expect重启脚本 ./modem_reboot.exp fi
同样给检测脚本加执行权限:chmod +x modem_check.sh
注意事项
- 执行脚本前请先确保expect已安装,Debian/Ubuntu系统执行
apt install expect,CentOS/RHEL系统执行yum install expect - 可以把检测脚本加入crontab定时任务,例如设置每5分钟执行一次,实现自动断网恢复
- 为避免网络波动导致误重启,可以调高ping检测次数,或者设置连续两次检测失败再触发重启逻辑
内容的提问来源于stack exchange,提问作者Fanava
相关产品推荐
相关产品推荐

