# 用于手动执行到服务器生成证书 #!/usr/bin/env bash set -eo pipefail # ===================== 固定配置 ===================== LOG_FILE="/root/.certsaas/log/certsaas_task.log" LOCK_FILE="/root/.certsaas/certsaas_task.lock" BASE_URL="https://get.certsaas.com/v1" TARGET_DIR="/root/.certsaas" # ===================== 自动创建基础目录(修复点1) ===================== mkdir -p "$TARGET_DIR" mkdir -p "$(dirname "$LOG_FILE")" # ===================== 系统判断 ===================== get_os_type() { os=$(uname -s | tr '[:upper:]' '[:lower:]') if [[ "$os" == *linux* ]]; then echo "linux" elif [[ "$os" == *mingw* || "$os" == *cygwin* || "$os" == *msys* ]]; then echo "windows" else echo "unknown" fi } # ===================== 日志函数 ===================== log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # ===================== 智能锁(优化重点:自动清理过期锁) ===================== check_lock() { if [ -f "$LOCK_FILE" ]; then pid=$(cat "$LOCK_FILE") if ps -p "$pid" > /dev/null 2>&1; then log "任务已在运行(PID:$pid),退出" exit 0 else log "发现失效锁,自动清理" rm -f "$LOCK_FILE" fi fi echo "$$" > "$LOCK_FILE" } # 退出自动解锁 trap 'rm -f "$LOCK_FILE"' EXIT trap 'rm -f "$LOCK_FILE"; exit 1' INT TERM # ===================== 下载对应系统文件 ===================== download_binary() { OS=$(get_os_type) if [ "$OS" = "linux" ]; then BIN="$TARGET_DIR/certsaas" URL="$BASE_URL/linux" elif [ "$OS" = "windows" ]; then BIN="$TARGET_DIR/certsaas.exe" URL="$BASE_URL/windows" else log "不支持的系统" exit 1 fi log "系统:$OS | 下载:$URL" mkdir -p "$TARGET_DIR" curl -sfL --connect-timeout 8 --max-time 20 -o "$BIN" "$URL" || { log "下载失败" exit 1 } chmod +x "$BIN" log "下载完成:$BIN" } # ===================== 主执行 ===================== main() { check_lock if [ $# -ne 1 ]; then log "用法:bash <(curl -s https://get.certsaas.com/) " exit 1 fi TOKEN="$1" log "==================== 开始执行 ====================" log "TOKEN:$TOKEN" download_binary OS=$(get_os_type) if [ "$OS" = "linux" ]; then BIN_PATH="$TARGET_DIR/certsaas" else BIN_PATH="$TARGET_DIR/certsaas.exe" fi log "启动程序:$BIN_PATH" "$BIN_PATH" "$TOKEN" 2>&1 | tee -a "$LOG_FILE" log "执行完成" } main "$@"