家里网络突然卡顿,光猫指示灯狂闪却找不到原因?作为网络管理员,是否经常接到同事抱怨网速慢的电话?这些场景下,重启光猫往往是最快解决问题的办法。但每次都手动操作实在太麻烦,特别是遇到远程设备或半夜突发故障时。
传统的光猫维护方式存在几个痛点:首先需要物理接触设备,对于安装在机房或高处的不便操作;其次手动重启流程繁琐,需要登录管理页面、找到重启按钮、确认操作;最重要的是无法预判性维护,只能在问题出现后被动处理。
我管理的30多台TEWA系列光猫就经常遇到这类问题。直到发现可以用Shell脚本配合Curl工具实现自动化操作,工作效率直接提升10倍。这个方案的核心价值在于:
不同品牌的光猫管理接口差异很大。以常见的TEWA-1006G为例,其管理页面通常位于http://192.168.1.1,但有些运营商版本会修改为192.168.100.1等特殊地址。确认方法很简单:
bash复制# 查看当前网关地址
route -n | grep 'UG' | awk '{print $2}'
记下这个IP,用浏览器访问会出现登录页面。注意观察URL结构,典型的管理接口路径包括:
/cgi-bin/luci(天翼网关常见)/html/management/(华为部分型号)/login.cgi(中兴某些版本)脚本依赖两个核心工具:
在Ubuntu/Debian上安装:
bash复制sudo apt update && sudo apt install curl grep coreutils -y
CentOS/RHEL系统:
bash复制sudo yum install curl grep coreutils -y
验证安装:
bash复制curl --version | head -1
grep --version | head -1
光猫背面标签通常标注了默认账号密码,但运营商可能已修改。如果无法登录,可以尝试以下组合:
| 用户类型 | 用户名 | 密码规则 |
|---|---|---|
| 普通用户 | useradmin | 标签背面8位随机码 |
| 超级管理员 | telecomadmin | 运营商动态密码 |
| 工程模式 | admin | admin |
建议先用浏览器正常登录一次,通过开发者工具(F12)抓取实际的请求参数。重点关注:
现代光猫普遍采用Cookie+Token的双重认证。整个流程分为三个阶段:
用curl模拟这个过程时,关键是要还原浏览器的完整请求头。常见需要包含的Headers:
bash复制-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)' \
-H 'Accept-Language: zh-CN,zh;q=0.9' \
-H 'Referer: http://192.168.1.1/login.html' \
-H 'X-Requested-With: XMLHttpRequest'
特别是User-Agent不能随便写,某些光猫会校验浏览器类型。建议使用主流浏览器的真实UA字符串。
以下是增强版脚本,增加了错误处理和日志功能:
bash复制#!/bin/bash
# 配置区
ROUTER_IP="192.168.1.1"
USERNAME="useradmin"
PASSWORD="n7d4D2mX"
LOG_FILE="/var/log/光猫重启.log"
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 获取Cookie
COOKIE=$(curl -s -i "http://$ROUTER_IP/cgi-bin/luci" \
-H "Referer: http://$ROUTER_IP/" \
-d "username=$USERNAME&psd=$PASSWORD" \
| grep -i 'Set-Cookie' \
| cut -d' ' -f2 \
| cut -d';' -f1)
[ -z "$COOKIE" ] && log "获取Cookie失败" && exit 1
# 获取Token
TOKEN=$(curl -s "http://$ROUTER_IP/cgi-bin/luci/admin/settings" \
-H "Cookie: $COOKIE" \
| grep -oE 'token=[a-f0-9]{32}' \
| cut -d'=' -f2)
[ -z "$TOKEN" ] && log "获取Token失败" && exit 1
# 执行重启
RESPONSE=$(curl -s -i "http://$ROUTER_IP/cgi-bin/luci/admin/reboot" \
-H "Cookie: $COOKIE" \
-d "token=$TOKEN")
if [[ $RESPONSE =~ "200 OK" ]]; then
log "重启指令发送成功"
else
log "重启失败,响应:$RESPONSE"
fi
关键改进点:
将脚本加入cron实现定期重启:
bash复制# 每天凌晨3点执行
0 3 * * * /path/to/脚本.sh >> /var/log/光猫重启.log 2>&1
更科学的做法是智能检测,当延迟超过阈值时自动重启:
bash复制#!/bin/bash
MAX_LATENCY=100 # 毫秒
GW_IP=$(route -n | grep 'UG' | awk '{print $2}')
current_ping=$(ping -c 3 $GW_IP | tail -1 | awk '{print $4}' | cut -d'/' -f2)
if (( $(echo "$current_ping > $MAX_LATENCY" | bc -l) )); then
echo "延迟过高($current_ping ms),触发重启" >> /var/log/auto_reboot.log
/path/to/脚本.sh
fi
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 获取Cookie失败 | 密码错误/接口变更 | 抓包确认最新登录流程 |
| Token不匹配 | 页面结构更新 | 更新正则表达式或改用JSON API |
| 403 Forbidden | IP限制/频率过高 | 添加延时或更换管理IP |
| 重启无效 | 厂商限制 | 尝试发送特殊指令(如诊断接口) |
遇到复杂情况时,建议先用Charles或Fiddler抓包,完整记录浏览器的请求过程,再对照修改脚本。某些光猫还需要先获取CSRF Token,流程会更复杂。
用文本文件存储设备列表(devices.txt):
code复制192.168.1.1 useradmin pass123
192.168.1.2 telecomadmin admin123
批量执行脚本:
bash复制while read -r ip user pass; do
ROUTER_IP=$ip USERNAME=$user PASSWORD=$pass /path/to/脚本.sh
done < devices.txt
对于大规模部署,建议改用Ansible等专业工具,但核心原理仍是基于Curl的HTTP操作。