diff --git a/nx30pro_upgrade.sh b/nx30pro_upgrade.sh new file mode 100644 index 0000000..9acf1a5 --- /dev/null +++ b/nx30pro_upgrade.sh @@ -0,0 +1,107 @@ +#!/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 "路由器未能在预期时间内上线,请手动检查"