如何在字符串中插入\n

如何在字符串中插入\n

我正在生成一个私钥,该密钥仅用于演示目的:

$ openssl genrsa

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvB8fZFRS83Kztend5KO9cnWXaqLWot0qLDeLcS8ly718FUdm
3VcCY5j737zz4iwmFf3b20Q2XxlbYC/M13wTJzHBf2d1mRDlpZq7CgX/JSEUW/Hr
uXiF6PI+ypkvskyoQcz04rlT8skd7tanXhXINnLwW7gCiNlxQQFkrpfO8Fkh+vYL
...
Ewac3GAh9CiMikQEYNxpsuLLboS4NcaQWiGB+1imtPtbp8Gf89pJSVBDubgza2Bb
rucNxP3HZtPd6G9CvkMJREYL7jHkXYa5DBzs9LB9mLB4b5H/6KN/fsfj
-----END RSA PRIVATE KEY-----

\n每行末尾都有一个换行符需要删除,我希望所有内容都在一行上,这样我就可以将其设置为环境变量。注意:我无法存储多行环境变量,.env因为docker-compose不支持它。

我已经删除了所有新行:

$(openssl genrsa | tr -d '\n')

-----BEGIN RSA PRIVATE KEY-----MII...-----END RSA PRIVATE KEY-----

然后,我手动插入两个换行符\n,我希望通过脚本实现自动化(因此这篇文章)。如果我不这样做,JWT 的签名就会失败。

-----BEGIN RSA PRIVATE KEY-----\nMII...\n-----END RSA PRIVATE KEY-----

.env我在文件中定义它

JWT_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\nMII...\n-----END RSA PRIVATE KEY-----

与节点和多滕夫我像这样访问它:

privateRsaKey = process.env.JWT_PRIVATE_KEY.replace(/\\n/gm, '\n'),

现在privateRsaKey看起来像这样:

-----BEGIN RSA PRIVATE KEY-----
MII...
-----END RSA PRIVATE KEY-----

现在我实际上使用私钥来签名智威汤逊

const signed = jwt.sign(payload, privateRsaKey, { 
  algorithm: 'RS256',
  ...
});

当我启动 Docker 容器时,上述所有内容都按预期工作。

我需要脚本方面的帮助,这样我就不必手动插入两个\n

感谢大家的帮助和耐心,非常感谢。

答案1

如果您只是将换行符替换为\n,结果是不明确的,因为\n可能是换行符或\n原始的换行符。在这种特定情况下这不是问题,因为输入不会包含\n,但对于许多其他情况来说这将是一个问题,包括一些可以在\n允许的情况下包含注释的 PEM 格式。

通过传输机制传递数据(在您的例子中,将其放入 Docker 容器)的常见方法是将其编码为 Base64。 Base64编码仅包含ASCII字母(大小写)、数字和三个标点符号+/=。空白并不重要。不带换行符的编码:

private_key="$(openssl genrsa)"
export encoded_private_key="$(printf '%s\n' "$private_key" | base64 | tr -d '\n')"

解码:

private_key=$(echo "$encoded_private_key" | base64 -d)

或者

echo "$encoded_private_key" | base64 -d >private_key.pem

答案2

Shell 专家会让它变得更简单,但这是我的看法:

openssl genrsa 2>/dev/null | awk '{ if ($0~"BEGIN RSA") {ORS="\\n"; print} else {if ($0~"END RSA") {print "\\n"; print} else {ORS=""; print}}}'

-----BEGIN RSA PRIVATE KEY-----
MIIE....skipped
-----END RSA PRIVATE KEY-----

生产出您想要的产品。

相关内容