#!/bin/bash # NX30Pro 一键升级脚本 # 固件来源: https://git.stickrouter.com/mike/N30pro/raw/branch/main/nx30pro512.bin # 目标路由器: 192.168.6.66 ROUTER_IP="192.168.6.66" ROUTER_USER="root" FIRMWARE_URL="https://git.stickrouter.com/mike/N30pro/raw/branch/main/nx30pro512.bin" FIRMWARE_NAME="nx30pro512.bin" REMOTE_PATH="/tmp/${FIRMWARE_NAME}" R="\033[91m"; G="\033[92m"; Y="\033[93m"; C="\033[96m"; W="\033[0m" log() { echo -e "${G}[INFO] $1${W}"; } warn() { echo -e "${Y}[WARN] $1${W}"; } err() { echo -e "${R}[ERR] $1${W}"; exit 1; } step() { echo -e "\n${C}${'='*50}\n $1\n${'='*50}${W}"; } echo -e "${C}" echo "==================================================" echo " NX30Pro 一键升级脚本" echo " 目标路由器: ${ROUTER_IP}" echo " 固件来源: Gitea" echo "==================================================" echo -e "${W}" # 检查 ssh/scp 是否可用 for cmd in ssh scp wget curl; do command -v $cmd &>/dev/null || err "缺少依赖: $cmd,请先安装" done # 检查路由器是否可达 echo -e "\n${C}[步骤 1/4] 检查路由器连接${W}" ping -c 1 -W 3 ${ROUTER_IP} &>/dev/null || err "无法连接到路由器 ${ROUTER_IP},请检查网络" log "路由器 ${ROUTER_IP} 可达" # 下载固件到本地 /tmp echo -e "\n${C}[步骤 2/4] 下载固件${W}" LOCAL_FW="/tmp/${FIRMWARE_NAME}" if [ -f "${LOCAL_FW}" ]; then warn "本地已存在固件文件,跳过下载" else log "从 Gitea 下载固件..." wget -q --show-progress "${FIRMWARE_URL}" -O "${LOCAL_FW}" || \ curl -L --progress-bar "${FIRMWARE_URL}" -o "${LOCAL_FW}" || \ err "固件下载失败" fi log "固件大小: $(du -h ${LOCAL_FW} | cut -f1)" # 上传固件到路由器 /tmp echo -e "\n${C}[步骤 3/4] 上传固件到路由器${W}" log "正在上传到 ${ROUTER_IP}:${REMOTE_PATH}..." scp -o StrictHostKeyChecking=no \ -o UserKnownHostsFile=/dev/null \ -o ConnectTimeout=10 \ "${LOCAL_FW}" "${ROUTER_USER}@${ROUTER_IP}:${REMOTE_PATH}" || err "上传失败" log "上传完成" # 验证文件大小 REMOTE_SIZE=$(ssh -o StrictHostKeyChecking=no \ -o UserKnownHostsFile=/dev/null \ "${ROUTER_USER}@${ROUTER_IP}" \ "wc -c < ${REMOTE_PATH} 2>/dev/null") LOCAL_SIZE=$(wc -c < "${LOCAL_FW}") if [ "${REMOTE_SIZE}" != "${LOCAL_SIZE}" ]; then err "文件大小不一致,上传可能失败 (本地: ${LOCAL_SIZE}, 远程: ${REMOTE_SIZE})" fi log "文件校验通过 (大小: ${LOCAL_SIZE} bytes)" # 执行升级 echo -e "\n${C}[步骤 4/4] 执行固件升级${W}" warn "升级过程中请勿断电!路由器将自动重启..." warn "升级完成后请访问 http://192.168.6.66 登录管理界面" echo "" read -p "确认升级? (y/N): " confirm if [[ "${confirm}" != "y" && "${confirm}" != "Y" ]]; then warn "已取消升级" exit 0 fi log "开始升级..." ssh -o StrictHostKeyChecking=no \ -o UserKnownHostsFile=/dev/null \ "${ROUTER_USER}@${ROUTER_IP}" \ "sysupgrade -F -n ${REMOTE_PATH}" & echo "" log "升级命令已发送,路由器正在重启..." log "等待路由器重启完成 (约60秒)..." sleep 60 # 检查路由器是否重启完成 for i in {1..10}; do if ping -c 1 -W 3 ${ROUTER_IP} &>/dev/null; then echo "" echo -e "${G}==================================================" echo " ✅ 升级完成!" echo " 请访问 http://${ROUTER_IP} 登录管理界面" echo -e "==================================================${W}" exit 0 fi log "等待路由器上线... ($i/10)" sleep 10 done warn "路由器未能在预期时间内上线,请手动检查"