#!/bin/sh # ============================================================== # ☁️ Tailscale 热更新脚本 (Universal / Pro) # 自动识别架构 | 自动识别包管理器 | 自动安装依赖 | 官方源更新 # ============================================================== # --- 1. 基础配置 --- REMOTE_URL_BASE="https://pkgs.tailscale.com/stable" TMP_DIR="/tmp/ts_cloud_up" BIN_DIR="/usr/sbin" # 定义颜色 (让输出好看点) GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' echo -e "${YELLOW}>>> 开始检查 Tailscale 更新...${NC}" # --- 2. 架构自动检测 --- echo -n "🔍 检测系统架构: " ARCH=$(uname -m) case $ARCH in x86_64) TS_ARCH="amd64" ;; aarch64) TS_ARCH="arm64" ;; armv7l) TS_ARCH="arm" ;; *) echo -e "${RED}不支持的架构: $ARCH${NC}" exit 1 ;; esac echo -e "${GREEN}$TS_ARCH ($ARCH)${NC}" # --- 3. 包管理器检测与依赖补全 (APK / OPKG) --- # 这一步是为了防止新系统没有 curl 或 tar echo -n "🔍 检测运行环境: " INSTALL_CMD="" PKG_MANAGER="" if command -v apk >/dev/null 2>&1; then PKG_MANAGER="apk" INSTALL_CMD="apk add" echo -e "${GREEN}APK (ImmortalWrt/Alpine)${NC}" elif command -v opkg >/dev/null 2>&1; then PKG_MANAGER="opkg" INSTALL_CMD="opkg update && opkg install" echo -e "${GREEN}OPKG (OpenWrt)${NC}" else echo -e "${YELLOW}未知环境 (假设依赖已存在)${NC}" fi # 检查核心依赖 curl, tar, gzip DEPENDENCIES="curl tar gzip" for dep in $DEPENDENCIES; do if ! command -v $dep >/dev/null 2>&1; then echo -e "${YELLOW}⚠️ 发现缺失依赖: $dep,正在尝试安装...${NC}" if [ -n "$INSTALL_CMD" ]; then $INSTALL_CMD $dep else echo -e "${RED}❌ 无法自动安装 $dep,请手动安装!${NC}" exit 1 fi fi done # --- 4. 获取版本信息 --- echo -n "☁️ 获取官方最新版本... " # 抓取官方文件名中的版本号 LATEST_VER=$(curl -s $REMOTE_URL_BASE/ | grep -o 'tailscale_[0-9]*.[0-9]*.[0-9]*_' | head -1 | cut -d_ -f2) if [ -z "$LATEST_VER" ]; then echo -e "${RED}获取失败,请检查网络连接${NC}" exit 1 fi echo -e "${GREEN}$LATEST_VER${NC}" # 获取本地版本 if command -v tailscale >/dev/null; then LOCAL_VER=$(tailscale version | head -n1 | awk '{print $1}') else LOCAL_VER="未安装" fi echo -e "🏷️ 当前本地版本: ${YELLOW}$LOCAL_VER${NC}" # --- 5. 判断是否更新 --- if [ "$LOCAL_VER" = "$LATEST_VER" ]; then echo -e "${GREEN}✅ 当前已是最新版本,无需更新。${NC}" exit 0 fi echo -e "${YELLOW}🚀 发现新版本,开始更新...${NC}" # --- 6. 下载与安装 --- FILENAME="tailscale_${LATEST_VER}_${TS_ARCH}.tgz" DOWNLOAD_URL="${REMOTE_URL_BASE}/${FILENAME}" mkdir -p $TMP_DIR cd $TMP_DIR echo -e "⬇️ 正在下载: $FILENAME" # curl -L 跟随重定向,-O 保存文件 curl -L -O "$DOWNLOAD_URL" if [ $? -ne 0 ]; then echo -e "${RED}❌ 下载失败!${NC}" rm -rf $TMP_DIR exit 1 fi echo "📦 解压并安装..." tar xzf $FILENAME EXTRACT_DIR="tailscale_${LATEST_VER}_${TS_ARCH}" # --- 7. 热替换二进制文件 --- # 停止服务 (兼容不同命名) /etc/init.d/tailscale stop 2>/dev/null || /etc/init.d/tailscaled stop 2>/dev/null # 暴力覆盖 cp -f $TMP_DIR/$EXTRACT_DIR/tailscale $BIN_DIR/tailscale cp -f $TMP_DIR/$EXTRACT_DIR/tailscaled $BIN_DIR/tailscaled chmod +x $BIN_DIR/tailscale chmod +x $BIN_DIR/tailscaled # 重启服务 /etc/init.d/tailscale start 2>/dev/null || /etc/init.d/tailscaled start 2>/dev/null # --- 8. 清理与完成 --- rm -rf $TMP_DIR NEW_VER=$(tailscale version | head -n1 | awk '{print $1}') echo -e "${GREEN}🎉 更新完成!当前版本: $NEW_VER${NC}"