主题模式
Are you an LLM? You can read better optimized documentation at /asus/ssh-advanced.md for this page in Markdown format
梅林固件 SSH 进阶技巧:自动化脚本、定时任务与 Entware 扩展
华硕梅林固件基于 Linux,通过 SSH 可以做远超管理界面的事情。本文介绍如何利用 SSH 将路由器打造成一个自动化运维平台。
🔑 SSH 连接路由器
启用 SSH
- 登录路由器管理界面。
- 进入 系统管理 → 系统设置。
- SSH Daemon → 启用 SSH 访问。
- 设置端口号(默认 22)。
- 点击 应用。
连接方式
bash
# 基本连接
ssh [email protected]
# 指定端口
ssh -p 22 [email protected]
# 使用密钥登录(更安全)
ssh -i ~/.ssh/id_rsa [email protected]配置 SSH 密钥登录
bash
# 1. 生成密钥对(在本地电脑上)
ssh-keygen -t ed25519 -C "asus-router"
# 2. 将公钥上传到路由器
cat ~/.ssh/id_ed25519.pub | ssh [email protected] "mkdir -p /tmp/home/.ssh && cat >> /tmp/home/.ssh/authorized_keys"
# 3. 持久化密钥(重启后仍然有效)
# 将 authorized_keys 保存到 JFFS 分区
mkdir -p /jffs/ssh
cp /tmp/home/.ssh/authorized_keys /jffs/ssh/在路由器上添加开机脚本确保持久化:
bash
echo "mkdir -p /tmp/home/.ssh && cp /jffs/ssh/authorized_keys /tmp/home/.ssh/" >> /jffs/scripts/post-mount
chmod +x /jffs/scripts/post-mount📦 安装 Entware
Entware 是路由器上的包管理器,可以安装数百个 Linux 软件包。
安装步骤
bash
# 1. 确保 USB 硬盘已挂载
ls /tmp/mnt/
# 2. 下载安装脚本
wget -O /tmp/entware_install.sh http://bin.entware.net/armv7sf-k3.2/installer/generic.sh
# 3. 执行安装
sh /tmp/entware_install.sh架构选择
不同路由器 CPU 架构不同,安装脚本会自动检测。常见架构:
- ARMv7:RT-AC86U, RT-AX88U, RT-AX86U
- ARMv8:GT-AX11000, RT-AX89U
常用软件包
bash
# 更新包列表
opkg update
# 安装常用工具
opkg install curl wget vim htop nano
opkg install tar gzip unzip
opkg install python3 node
opkg install aria2 # 下载工具
opkg install transmission # BT 下载
opkg install samba36-client # SAMBA 客户端
opkg install nfs-utils # NFS 工具
opkg install mosquitto # MQTT 代理
opkg install shellinabox # Web 终端Entware 服务管理
bash
# 启动服务
/opt/etc/init.d/S50aria2 start
# 停止服务
/opt/etc/init.d/S50aria2 stop
# 查看服务状态
/opt/etc/init.d/S50aria2 check
# 开机自启(Entware 默认自启)
# 自启脚本位于 /opt/etc/init.d/📜 自定义脚本
JFFS 脚本目录
梅林固件支持以下自定义脚本(按执行顺序):
| 脚本文件 | 触发时机 | 用途 |
|---|---|---|
/jffs/scripts/init-start | 系统初始化 | 早期初始化 |
/jffs/scripts/post-mount | USB 挂载后 | Entware 初始化 |
/jffs/scripts/pre-mount | USB 挂载前 | 挂载前准备 |
/jffs/scripts/unmount | USB 卸载时 | 清理操作 |
/jffs/scripts/firewall-start | 防火墙启动后 | 自定义防火墙规则 |
/jffs/scripts/wan-start | WAN 连接后 | DDNS、VPN 启动 |
/jffs/scripts/nat-start | NAT 启动后 | 端口转发规则 |
注意
所有自定义脚本必须添加可执行权限:chmod +x /jffs/scripts/脚本名
脚本示例一:开机自动挂载 SMB
bash
#!/bin/sh
# /jffs/scripts/post-mount
# 开机自动挂载远程 SMB 共享
# 等待网络就绪
sleep 30
# 挂载远程 NAS
mkdir -p /tmp/mnt/nas-media
mount -t cifs //192.168.1.100/Media /tmp/mnt/nas-media -o username=user,password=pass,vers=3.0
logger "SMB mount completed"脚本示例二:防火墙自定义规则
bash
#!/bin/sh
# /jffs/scripts/firewall-start
# 自定义防火墙规则
# 仅允许内网访问路由器 SSH
iptables -I INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j DROP
# 屏蔽特定 IP
iptables -I FORWARD -d 10.0.0.100 -j DROP
# 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.50:80
iptables -t nat -A POSTROUTING -j MASQUERADE
logger "Custom firewall rules applied"脚本示例三:DDNS 更新
bash
#!/bin/sh
# /jffs/scripts/wan-start
# WAN 连接后更新 DDNS
# 获取当前公网 IP
CURRENT_IP=$(curl -s https://api.ipify.org)
# 更新 Cloudflare DNS 记录
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records/YOUR_RECORD_ID" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"home.yourdomain.com\",\"content\":\"$CURRENT_IP\",\"ttl\":60,\"proxied\":false}"
logger "DDNS updated to $CURRENT_IP"⏰ Cron 定时任务
启用 Cron
梅林固件内置 cron 支持,在路由器管理界面启用:
系统管理 → 系统设置 → Enable Cron → 勾选
添加定时任务
编辑 cron 配置文件:
bash
crontab -e常用定时任务示例:
crontab
# 每天凌晨 3 点重启路由器
0 3 * * * /sbin/reboot
# 每小时检查网络连通性
0 * * * * /jffs/scripts/network-check
# 每天 6 点更新 DDNS
0 6 * * * /jffs/scripts/wan-start
# 每周一凌晨 4 点清理日志
0 4 * * 1 /jffs/scripts/clean-logs
# 每 5 分钟检查 VPN 连接
*/5 * * * * /jffs/scripts/vpn-watchdog
# 每天凌晨 2 点备份配置
0 2 * * * /jffs/scripts/backup-config持久化 Cron 任务
Cron 任务在重启后会丢失。将任务写入开机脚本:
bash
#!/bin/sh
# /jffs/scripts/init-start
# 持久化 Cron 任务
cru a network-check "0 * * * * /jffs/scripts/network-check"
cru a vpn-watchdog "*/5 * * * * /jffs/scripts/vpn-watchdog"
cru a clean-logs "0 4 * * 1 /jffs/scripts/clean-logs"🔍 网络监控脚本
脚本一:网络连通性检测
bash
#!/bin/sh
# /jffs/scripts/network-check
# 检测网络连通性,断网自动重启 WAN
# 检测目标
TARGET="8.8.8.8"
# 发送 3 次 ping
if ! ping -c 3 -W 5 $TARGET > /dev/null 2>&1; then
logger "Network check FAILED, restarting WAN..."
# 重启 WAN
service restart_wan
sleep 30
# 再次检测
if ! ping -c 3 -W 5 $TARGET > /dev/null 2>&1; then
logger "Network still down after WAN restart, rebooting..."
/sbin/reboot
fi
else
logger "Network check OK"
fi脚本二:VPN 断线重连
bash
#!/bin/sh
# /jffs/scripts/vpn-watchdog
# VPN 断线自动重连
VPN_INTERFACE="tun1"
if ! ifconfig $VPN_INTERFACE > /dev/null 2>&1; then
logger "VPN is DOWN, reconnecting..."
# 重启 VPN 客户端
service start_vpnclient1
sleep 10
if ifconfig $VPN_INTERFACE > /dev/null 2>&1; then
logger "VPN reconnected successfully"
else
logger "VPN reconnection FAILED"
fi
fi脚本三:流量监控
bash
#!/bin/sh
# /jffs/scripts/traffic-monitor
# 记录每日流量
STATS_FILE="/jffs/traffic-stats.txt"
TODAY=$(date +%Y-%m-%d)
# 获取当前 RX/TX 字节数
RX=$(cat /sys/class/net/eth0/statistics/rx_bytes)
TX=$(cat /sys/class/net/eth0/statistics/tx_bytes)
# 转换为 MB
RX_MB=$((RX / 1024 / 1024))
TX_MB=$((TX / 1024 / 1024))
# 记录到文件
echo "$TODAY RX=${RX_MB}MB TX=${TX_MB}MB" >> $STATS_FILE
logger "Traffic stats: RX=${RX_MB}MB TX=${TX_MB}MB"📋 日志管理脚本
清理旧日志
bash
#!/bin/sh
# /jffs/scripts/clean-logs
# 清理旧日志文件
# 清理 7 天前的日志
find /tmp/var/log -name "*.log" -mtime +7 -delete
find /jffs/logs -name "*.log" -mtime +7 -delete
# 清理系统日志
cat /dev/null > /tmp/syslog.log
logger "Logs cleaned up"配置备份
bash
#!/bin/sh
# /jffs/scripts/backup-config
# 备份路由器配置
BACKUP_DIR="/tmp/mnt/USB/backups"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
# 备份 JFFS 分区
tar -czf $BACKUP_DIR/jffs-$DATE.tar.gz /jffs/
# 备份路由器设置
nvram save > $BACKUP_DIR/nvram-$DATE.txt
# 只保留最近 30 天的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
find $BACKUP_DIR -name "*.txt" -mtime +30 -delete
logger "Config backup completed"🛡️ 安全加固
1. 禁用密码登录
bash
# 编辑 SSH 配置
nvram set sshd_passauth=0
nvram commit2. 修改 SSH 端口
bash
# 修改 SSH 端口为 2222
nvram set sshd_port=2222
nvram commit
# 重启 SSH 服务
service restart_sshd3. 限制 SSH 访问 IP
在 /jffs/scripts/firewall-start 中添加:
bash
# 仅允许特定 IP 访问 SSH
iptables -I INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -s 192.168.1.101 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j DROP📊 系统信息查询
常用命令
bash
# 查看 CPU 温度
cat /sys/class/thermal/thermal_zone0/temp
# 查看内存使用
free -m
# 查看磁盘使用
df -h
# 查看网络连接
netstat -tlnp
# 查看进程
ps | grep [进程名]
# 查看路由表
route -n
# 查看 ARP 表
cat /proc/net/arp
# 查看 USB 设备
lsusb
# 查看挂载点
mount实时监控
bash
# 实时查看日志
tail -f /tmp/syslog.log
# 实时查看网络流量
iftop
# 实时查看进程
top❓ 常见问题
Q: 脚本开机不执行?
解决方案:
- 确认脚本有可执行权限:
chmod +x /jffs/scripts/脚本名 - 确认脚本第一行有 shebang:
#!/bin/sh - 检查脚本文件格式为 Unix(不是 Windows)
- 查看日志确认:
cat /tmp/syslog.log | grep script
Q: Entware 安装失败?
解决方案:
- 确认 USB 硬盘已格式化为 ext4
- 确认 USB 硬盘已正确挂载
- 检查路由器架构是否匹配安装脚本
- 查看安装日志排查错误
Q: Cron 任务不生效?
解决方案:
- 确认 Cron 已在管理界面启用
- 使用
cru l查看当前 Cron 任务 - 将任务写入
/jffs/scripts/init-start确保持久化 - 检查脚本路径是否正确
Q: 重启后自定义设置丢失?
解决方案:
- 将配置保存到
/jffs/目录(JFFS 分区重启不丢失) - 在
/jffs/scripts/init-start中恢复设置 - 使用
nvram set保存需要持久化的变量
🔗 相关文章
- 华硕路由器 USB 功能全解析 - 文件共享、下载机等
- 常用命令集合 - SSH 常用命令速查
- 梅林 Clash 配置 - 代理插件使用教程
- 刷机前置准备 - 固件刷机指南
