From cc363016381ad94d836d4035bda383f1f0e582ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=96=B0=E9=9B=A8?= Date: Tue, 3 Feb 2026 00:36:48 +0800 Subject: [PATCH] u --- .gitea/workflows/server-deploy.yml | 35 ++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/.gitea/workflows/server-deploy.yml b/.gitea/workflows/server-deploy.yml index 61304bb..a154741 100644 --- a/.gitea/workflows/server-deploy.yml +++ b/.gitea/workflows/server-deploy.yml @@ -81,12 +81,22 @@ jobs: # 写入私钥 if [[ -n "${SSH_KEY_B64:-}" ]]; then - # 去掉粘贴过程中可能混入的空白字符(换行/回车/空格/Tab) - # 避免出现:base64: invalid input - CLEAN_B64="$(printf '%s' "${SSH_KEY_B64}" | tr -d '\r\n\t ')" - if ! printf '%s' "${CLEAN_B64}" | base64 -d | tr -d '\r' > ~/.ssh/id_rsa; then - echo "私钥 base64 解码失败:请确认你配置的 *_SSH_KEY_B64 是对私钥文件做的 base64(单行),且未被截断。" - exit 1 + # 兼容两种常见误配置: + # 1) *_SSH_KEY_B64 里其实粘贴的是“原始私钥”(包含 -----BEGIN ... PRIVATE KEY-----) + # 2) base64 值在粘贴/保存过程中混入空白或其他无关字符 + if printf '%s' "${SSH_KEY_B64}" | grep -qE 'BEGIN[[:space:]].*PRIVATE[[:space:]]KEY'; then + echo "提示:检测到 *_SSH_KEY_B64 看起来是原始私钥内容,将按原始私钥写入(建议你改用真正的 base64 单行值)。" + printf '%s' "${SSH_KEY_B64}" | tr -d '\r' > ~/.ssh/id_rsa + else + # 去掉粘贴过程中可能混入的空白字符(换行/回车/空格/Tab) + CLEAN_B64="$(printf '%s' "${SSH_KEY_B64}" | tr -d '\r\n\t ')" + # -i/--ignore-garbage:忽略非 base64 字符,提升兼容性;最终仍会用 ssh-keygen 校验私钥可用性 + if ! printf '%s' "${CLEAN_B64}" | base64 -d -i | tr -d '\r' > ~/.ssh/id_rsa; then + echo "私钥 base64 解码失败:" + echo "- 请确认你在 Gitea Secrets 配置的 *_SSH_KEY_B64 是“单行 base64 字符串”,不要带引号/前后空格。" + echo "- 推荐用仓库里的脚本生成并复制:node scripts/ssh-key-to-b64.mjs ~/.ssh/你的私钥 --clipboard" + exit 1 + fi fi else printf '%s' "${SSH_KEY}" | tr -d '\r' > ~/.ssh/id_rsa @@ -94,9 +104,16 @@ jobs: chmod 600 ~/.ssh/id_rsa # 快速校验私钥是否可解析(不会输出私钥内容) - if ! ssh-keygen -y -f ~/.ssh/id_rsa >/dev/null 2>&1; then - echo "SSH 私钥无法解析(常见原因:内容复制丢换行/截断、格式不兼容、或 base64 不正确)。" - echo "推荐:生成一把“无口令”的部署专用私钥,并用 base64 存储到 Secrets。" + if ! ssh-keygen -y -f ~/.ssh/id_rsa >/dev/null 2>~/.ssh/ssh_key_check.err; then + echo "SSH 私钥无法解析。下面是 ssh-keygen 的报错(不包含私钥内容):" + cat ~/.ssh/ssh_key_check.err || true + echo + echo "常见原因:" + echo "- 你填的是公钥(.pub),不是私钥" + echo "- 私钥带口令(CI 无法交互输入 passphrase)" + echo "- 内容复制丢换行/被截断/不是正确的 base64" + echo + echo "推荐:生成一把“无口令”的部署专用私钥,并用 base64 存储到 Secrets(*_SSH_KEY_B64)。" exit 1 fi