由于 shell 中的字符串转义问题:
用 export RSA_KEY="..."
方式手动定义环境变量时,\n
实际是作为两个字符(反斜杠和 n)存进了变量中,而不是换行符。
\n
解释为真实的换行符你有两种推荐方式来正确设置该多行 RSA 私钥的环境变量:
printf
设置(推荐)export RSA_KEY=$(printf "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDR+yI68bXb/Hm8\n...")
这个方式中,printf
会把 \n
正确地转为换行符,然后通过 $(...)
放入环境变量中。
export RSA_KEY="$(cat <<EOF
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDR+yI68bXb/Hm8
...(中间略)...
-----END PRIVATE KEY-----
EOF
)"
这种方式可以直接写多行私钥,不需要转义 \n
。
你可以这样打印检查:
echo "$RSA_KEY"
应该能看到多行私钥。
而用:
echo $RSA_KEY
会显示成一行(换行符被 shell 展平了),这是正常现象。
\n
转义形式写入 .env
文件或 CI/CD:那么在代码中需要用语言的方式把 \\n
替换成真实换行:
在 Node.js 里:
const key = process.env.RSA_KEY.replace(/\\n/g, '\n');
在 Go 中:
key := strings.ReplaceAll(os.Getenv("RSA_KEY"), `\n`, "\n")
方式 | 特点 | 示例 |
---|---|---|
printf |
保留换行符,适合单行设置 | export VAR=$(printf "...") |
heredoc | 适合写入多行值,最可读 | export VAR="$(cat < |
写 \n 转义 |
适合 .env 文件/CI,用代码再还原 |
RSA_KEY="line1\nline2\n..." |