diff --git a/deploy.sh b/deploy.sh index 24423b7..4658a70 100755 --- a/deploy.sh +++ b/deploy.sh @@ -9,6 +9,7 @@ SERVER_WEB="${SERVER_WEB:-myweb}" REMOTE_WORKDIR="${REMOTE_WORKDIR:-/home/gavin/font2svg}" SKIP_PUSH="${SKIP_PUSH:-0}" SKIP_SUDO="${SKIP_SUDO:-0}" +MYWEB_SUDO_PASSWORD="${MYWEB_SUDO_PASSWORD:-}" COLOR_RESET=$'\033[0m' COLOR_INFO=$'\033[1;36m' @@ -34,6 +35,41 @@ ssh_web() { ssh -o BatchMode=yes -o ConnectTimeout=12 "$SERVER_WEB" "$@" } +load_sudo_password() { + if [[ -n "$MYWEB_SUDO_PASSWORD" ]]; then + return + fi + + [[ -r .env ]] || { + log_error '未找到 .env;请设置 MYWEB_SUDO_PASSWORD 或在 .env 中配置密码。' + exit 1 + } + + local line secret='' plain_lines=() + while IFS= read -r line || [[ -n "$line" ]]; do + case "$line" in + MYWEB_SUDO_PASSWORD=*|SUDO_PASSWORD=*) secret="${line#*=}" ;; + ''|'#'*) ;; + *) plain_lines+=("$line") ;; + esac + done < .env + + if [[ -z "$secret" && ${#plain_lines[@]} -eq 1 ]]; then + secret="${plain_lines[0]}" + fi + + # 兼容 .env 中常见的单引号或双引号包裹形式,不执行其中任何内容。 + if [[ ${#secret} -ge 2 ]] && { [[ ${secret:0:1} == '"' && ${secret: -1} == '"' ]] || [[ ${secret:0:1} == "'" && ${secret: -1} == "'" ]]; }; then + secret="${secret:1:${#secret}-2}" + fi + + [[ -n "$secret" ]] || { + log_error '无法从 .env 读取 sudo 密码;请使用 MYWEB_SUDO_PASSWORD=密码。' + exit 1 + } + MYWEB_SUDO_PASSWORD="$secret" +} + check_local_environment() { log_step '1/8 检查 M4 本机环境' for tool in git pnpm node python3 rsync ssh curl; do @@ -107,8 +143,9 @@ apply_nginx_and_restart() { log_warn 'SKIP_SUDO=1,跳过需要 sudo 的 Nginx/API 重启' return fi - log_info '将要求输入 myweb 的 sudo 密码,用于安装配置、校验并重载 Nginx。' - ssh -tt -o ConnectTimeout=12 "$SERVER_WEB" "sudo install -m 644 '$REMOTE_WORKDIR/fonts.conf' /etc/nginx/conf.d/fonts.conf && sudo nginx -t && sudo systemctl reload nginx && sudo systemctl restart font2svg-api" + load_sudo_password + log_info '从 .env 读取 sudo 密码,用于安装配置、校验并重载 Nginx。' + printf '%s\n' "$MYWEB_SUDO_PASSWORD" | ssh -tt -o ConnectTimeout=12 "$SERVER_WEB" "sudo -S -p '' install -m 644 '$REMOTE_WORKDIR/fonts.conf' /etc/nginx/conf.d/fonts.conf && sudo -S -p '' nginx -t && sudo -S -p '' systemctl reload nginx && sudo -S -p '' systemctl restart font2svg-api" log_ok 'Nginx 已重载,Font2SVG API 已重启' }