OpenWRT Cron定时任务进阶玩法:除了重启,还能用脚本实现这些自动化
凌晨三点,路由器突然自动重启完成了一次固件更新,同时将最新配置备份到云端,随后向你的邮箱发送了执行报告——这不是科幻场景,而是用OpenWRT的Cron和Shell脚本就能实现的自动化运维。对于已经掌握基础定时命令的网络管理员来说,真正的效率革命始于将Cron从"定时开关"升级为"智能管家"。
1. 环境准备与基础强化
1.1 启用Cron服务的高级配置
虽然OpenWRT默认安装了Cron服务,但我们需要更精细的控制。通过SSH登录路由器后,执行以下命令确保服务正常运行:
/etc/init.d/cron enable /etc/init.d/cron start验证服务状态时,不要满足于简单的状态检查:
logread -e cron这个命令会显示Cron服务的详细日志,包括最近执行的任务记录。建议在/etc/crontabs/目录下创建个人任务文件而非直接修改root文件,例如:
touch /etc/crontabs/network_admin chmod 600 /etc/crontabs/network_admin1.2 时间表达式深度解析
Cron表达式中的特殊符号组合能实现精准控制:
| 符号 | 功能描述 | 应用示例 | 实际效果 |
|---|---|---|---|
| */x | 每x单位间隔执行 | */15 * * * * | 每15分钟执行 |
| x-y | 范围区间 | 0 9-17 * * 1-5 | 工作日9点到17点整点执行 |
| a,b | 多时间点组合 | 0 8,20 * * * | 每天8点和20点执行 |
| L | 最后一天(需系统支持) | 0 0 L * * | 每月最后一天午夜执行 |
提示:不同系统对Cron表达式的支持可能有差异,建议先在测试环境验证复杂表达式
2. 实用自动化脚本案例
2.1 智能配置备份系统
创建一个/usr/local/bin/backup_config.sh脚本:
#!/bin/sh CONFIG_BAK_DIR="/mnt/sda1/backups" [ -d $CONFIG_BAK_DIR ] || mkdir -p $CONFIG_BAK_DIR TIMESTAMP=$(date +%Y%m%d-%H%M%S) sysupgrade -b $CONFIG_BAK_DIR/config-$TIMESTAMP.tar.gz find $CONFIG_BAK_DIR -name "*.tar.gz" -mtime +30 -delete然后在Cron中添加(每天凌晨2点执行):
0 2 * * * /usr/local/bin/backup_config.sh >/dev/null 2>&1这个脚本实现了:
- 自动创建备份目录(如果不存在)
- 生成带时间戳的备份文件
- 自动清理30天前的旧备份
2.2 网络状态监控与报警
/usr/local/bin/network_monitor.sh脚本示例:
#!/bin/sh LOG_FILE="/var/log/network_status.log" ALERT_EMAIL="your@email.com" ping -c 3 8.8.8.8 > /dev/null if [ $? -ne 0 ]; then echo "$(date) - Network Down!" >> $LOG_FILE /usr/sbin/reboot else SPEEDTEST=$(speedtest-cli --simple) if [ $(echo "$SPEEDTEST" | awk '/Download/{print $2}') -lt 50 ]; then echo "$SPEEDTEST" | mail -s "Slow Network Alert" $ALERT_EMAIL fi fi对应的Cron任务(每30分钟检查一次):
*/30 * * * * /usr/local/bin/network_monitor.sh3. 系统维护自动化
3.1 智能软件包更新
避免在高峰时段更新造成网络卡顿:
#!/bin/sh HOUR=$(date +%H) if [ $HOUR -ge 2 ] && [ $HOUR -le 4 ]; then opkg update UPDATES=$(opkg list-upgradable | wc -l) if [ $UPDATES -gt 0 ]; then opkg upgrade echo "Updated $UPDATES packages" | mail -s "OpenWRT Update Report" $ALERT_EMAIL fi fi设置凌晨2-4点间随机时间执行(避免多设备同时更新):
$(($RANDOM%60)) $(($RANDOM%3+2)) * * * /usr/local/bin/auto_update.sh3.2 日志文件智能管理
复合条件的日志清理脚本:
#!/bin/sh # 保留最近7天的日志 find /var/log/ -name "*.log" -mtime +7 -delete # 但error.log保留30天 find /var/log/ -name "error.log" -mtime +30 -delete # 清空过大(>10MB)的日志文件 find /var/log/ -size +10M -exec truncate -s 0 {} \;对应的Cron配置(每天3:15执行):
15 3 * * * /usr/local/bin/log_cleaner.sh4. 高级联动应用
4.1 与智能家居设备联动
通过curl控制支持API的智能插座:
#!/bin/sh # 工作日23:00关闭客厅灯光 if [ $(date +%u) -le 5 ]; then curl -X POST http://smart_hub_ip/api/light/off -H "Token: YOUR_TOKEN" fiCron表达式:
0 23 * * 1-5 /usr/local/bin/smart_home_control.sh4.2 动态QoS策略调整
根据时间段自动调整带宽分配:
#!/bin/sh HOUR=$(date +%H) if [ $HOUR -ge 8 ] && [ $HOUR -le 22 ]; then # 日间模式:优先保障视频会议 tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle 1: htb default 20 tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit tc class add dev eth0 parent 1:1 classid 1:10 htb rate 60mbit ceil 80mbit prio 1 tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 3478 0xffff flowid 1:10 else # 夜间模式:优先保障下载 tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle 1: htb default 10 tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit tc class add dev eth0 parent 1:1 classid 1:20 htb rate 80mbit ceil 95mbit prio 1 tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 21 0xffff flowid 1:20 fi设置早晚各执行一次:
0 8,22 * * * /usr/local/bin/qos_adjust.sh5. 安全增强实践
5.1 自动化安全扫描
定期检查可疑连接:
#!/bin/sh REPORT="/var/log/security_scan_$(date +%Y%m%d).log" netstat -tulnp | grep -E '0.0.0.0|:::' > $REPORT lsof -i | grep -E 'LISTEN|ESTABLISHED' >> $REPORT grep -q "suspicious_ip" $REPORT && mail -s "Security Alert" $ALERT_EMAIL < $REPORTCron配置(每小时检查一次):
0 * * * * /usr/local/bin/security_check.sh5.2 动态防火墙规则
工作时间段开放特定端口:
#!/bin/sh DAY=$(date +%u) HOUR=$(date +%H) if [ $DAY -le 5 ] && [ $HOUR -ge 9 ] && [ $HOUR -le 18 ]; then ufw allow 3389/tcp # 允许RDP else ufw deny 3389/tcp fi设置每30分钟检查一次:
*/30 * * * * /usr/local/bin/firewall_adjust.sh