diff --git a/.gitea/workflows/server-deploy.yml b/.gitea/workflows/server-deploy.yml index aeb9ce1..b3dfd43 100644 --- a/.gitea/workflows/server-deploy.yml +++ b/.gitea/workflows/server-deploy.yml @@ -87,9 +87,11 @@ jobs: # 2) base64 值在粘贴/保存过程中混入空白或其他无关字符 if printf '%s' "${SSH_KEY_B64}" | grep -qE 'BEGIN[[:space:]].*PRIVATE[[:space:]]KEY'; then echo "提示:检测到 *_SSH_KEY_B64 看起来是原始私钥内容,将按原始私钥写入(建议你改用真正的 base64 单行值)。" + echo "SSH_KEY_B64 字符数(原始):${#SSH_KEY_B64}" printf '%s' "${SSH_KEY_B64}" | tr -d '\r' > "${SSH_KEY_PATH}" else CLEAN_B64="$(printf '%s' "${SSH_KEY_B64}" | tr -d '\r\n\t ')" + echo "SSH_KEY_B64 字符数(原始/清理后):${#SSH_KEY_B64}/${#CLEAN_B64}" if ! printf '%s' "${CLEAN_B64}" | base64 -d -i | tr -d '\r' > "${SSH_KEY_PATH}"; then echo "私钥 base64 解码失败:" echo "- 请确认你在 Gitea Secrets 配置的 *_SSH_KEY_B64 是“单行 base64 字符串”,不要带引号/前后空格。" @@ -98,19 +100,60 @@ jobs: fi fi else + echo "使用 SSH_KEY(原始私钥)写入。SSH_KEY 字符数:${#SSH_KEY}" printf '%s' "${SSH_KEY}" | tr -d '\r' > "${SSH_KEY_PATH}" fi chmod 600 "${SSH_KEY_PATH}" # 自检(不输出私钥内容,仅输出元信息,方便定位是否写入了错误文件/被截断) echo "SSH_KEY_PATH=${SSH_KEY_PATH}" - echo "SSH key 字节数:$(wc -c < "${SSH_KEY_PATH}" | tr -d ' ')" + KEY_BYTES="$(wc -c < "${SSH_KEY_PATH}" | tr -d ' ')" + KEY_LINES="$(wc -l < "${SSH_KEY_PATH}" | tr -d ' ')" + echo "SSH key 字节数:${KEY_BYTES}" + echo "SSH key 行数:${KEY_LINES}" echo "SSH key 首行:$(head -n 1 "${SSH_KEY_PATH}" | tr -d '\r')" echo "SSH key 末行:$(tail -n 1 "${SSH_KEY_PATH}" | tr -d '\r')" + if command -v stat >/dev/null 2>&1; then + # Ubuntu runner: stat -c;不同系统做兼容 + if stat -c '%a %U %G %n' "${SSH_KEY_PATH}" >/dev/null 2>&1; then + echo "SSH key 权限:$(stat -c '%a %U %G %n' "${SSH_KEY_PATH}")" + else + echo "SSH key 权限:$(stat -f '%Lp %Su %Sg %N' "${SSH_KEY_PATH}" 2>/dev/null || true)" + fi + fi + if command -v file >/dev/null 2>&1; then + echo "file(1) 识别:$(file "${SSH_KEY_PATH}")" + fi if command -v sha256sum >/dev/null 2>&1; then echo "SSH key sha256(前12位):$(sha256sum "${SSH_KEY_PATH}" | awk '{print substr($1,1,12)}')" fi + # 进一步校验:OpenSSH 私钥中间的 base64 块是否可解码(不输出内容) + if grep -q '^-----BEGIN OPENSSH PRIVATE KEY-----$' "${SSH_KEY_PATH}" && grep -q '^-----END OPENSSH PRIVATE KEY-----$' "${SSH_KEY_PATH}"; then + OPENSSH_B64_LEN="$(awk ' + BEGIN{in=0; n=0} + /^-----BEGIN OPENSSH PRIVATE KEY-----$/{in=1; next} + /^-----END OPENSSH PRIVATE KEY-----$/{in=0; exit} + in==1{gsub(/\r/,""); n+=length($0)} + END{print n} + ' "${SSH_KEY_PATH}")" + echo "OpenSSH base64 块字符数(合计):${OPENSSH_B64_LEN}" + if ! awk ' + BEGIN{in=0} + /^-----BEGIN OPENSSH PRIVATE KEY-----$/{in=1; next} + /^-----END OPENSSH PRIVATE KEY-----$/{in=0; exit} + in==1{gsub(/\r/,""); print} + ' "${SSH_KEY_PATH}" | tr -d '\n' | base64 -d >/dev/null 2>&1; then + echo "OpenSSH 私钥的 base64 块无法解码:疑似内容被截断/损坏(即使首尾行还在)。" + fi + fi + + # 额外信息:ssh-keygen -lf 的报错(不输出私钥内容) + if ! ssh-keygen -lf "${SSH_KEY_PATH}" >/dev/null 2>~/.ssh/ssh_key_fingerprint.err; then + echo "ssh-keygen -lf 报错:" + cat ~/.ssh/ssh_key_fingerprint.err || true + fi + # 快速校验私钥是否可解析(不会输出私钥内容) if ! ssh-keygen -y -f "${SSH_KEY_PATH}" >/dev/null 2>~/.ssh/ssh_key_check.err; then echo "SSH 私钥无法解析。下面是 ssh-keygen 的报错(不包含私钥内容):"