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
没有评论