
OpenWRT
1 前言
一个问题,一篇文章,一出故事。
笔者把路由设备更换为OpenWRT,基于中国电信分配的公网IP地址需要不定时更换,因此笔者希望借助脚本将其定期更换。
2 最佳实践
2.1 创建脚本
vim /root/scripts/pppoeReconnect.sh
加入如下配置,
#!/bin/sh # Configuration (DO NOT CHANGE THESE VALUES) logicalIf="wlan" # Logical interface name in UCI config pppoeIf="pppoe-wlan" # Virtual PPPoE interface phyIf="eth0" # Physical NIC maxWait=60 # Maximum wait time in seconds logFile="/var/log/pppoeReconnect.log" # Function: Safely get current IP getIp() { ip -4 addr show $pppoeIf 2>/dev/null | awk '/inet/{print $2}' | cut -d'/' -f1 } # Logging using echo log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $logFile echo "PPPoE: $1" } # Main process log "=== Starting PPPoE reconnection ===" oldIp=$(getIp) log "Current IP: ${oldIp:-None}" # Phase 1: Graceful restart log "Attempting graceful restart..." ifdown $logicalIf 2>/dev/null sleep 5 ifup $logicalIf 2>/dev/null # Phase 2: Force restart if needed if [ -z "$(getIp)" ]; then log "Graceful restart failed, forcing..." { killall -9 pppd 2>/dev/null ip link set $phyIf down sleep 2 ip link set $phyIf up sleep 3 ifup $logicalIf } 2>/dev/null fi # Verification with timeout timeout=$maxWait while [ $timeout -gt 0 ] && [ -z "$(getIp)" ]; do sleep 5 timeout=$((timeout-5)) log "Waiting for IP... (${timeout}s left)" done # Result handling newIp=$(getIp) if [ -n "$newIp" ]; then if [ "$newIp" != "$oldIp" ]; then log "SUCCESS! New IP: $newIp" else log "WARNING: IP unchanged ($newIp), ISP may limit changes" fi else log "FAILED! Last error: $(logread | grep pppd | tail -n 1 2>/dev/null || echo 'unknown error')" exit 1 fi
2.2 测试脚本
sh /root/scripts/pppoeReconnect.sh
2.3 设置脚本触发
crontab -e
加入如下配置,
0 3 * * * sh /root/scripts/pppoeReconnect.sh
没有评论