This commit is contained in:
吕新雨
2026-02-03 00:36:48 +08:00
parent 5dd632d4d3
commit cc36301638

View File

@@ -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