如何在 Bash/Terminal 中导出多行环境变量,例如:RSA 私钥

How to Export a Multi-line Environment Variable in Bash/Terminal e.g: RSA Private Key

我们的一个应用程序 github-backup 需要使用 RSA 私钥作为环境变量。

只是尝试在终端中导出密钥,例如: text export PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA04up8hoqzS1+ ... l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy== -----END RSA PRIVATE KEY-----

不起作用...因为换行符。

我用谷歌搜索了一下,但没有找到可行的解决方案...
例如:

错误: -----END RSA PRIVATE KEY-----': not a valid identifier

遵循以下说明: http://blog.vawter.com/2016/02/10/Create-an-Environment-Variable-from-a-Private-Key

创建了一个名为 keytoenvar.sh 的文件,其中包含以下行:

#!/usr/bin/env bash
file=
name=
export $name="$(awk 'BEGIN{}{out=out[=11=]"\n"}END{print out}' $file| sed 's/\n$//')"

然后 运行 以下命令:

source keytoenvar.sh PRIVATE_KEY ./gitbu.2018-03-23.private-key.pem

可行,但它似乎是一种“冗长”的方法...

有谁知道更简单的方法吗?
我希望有一个“初学者友好”的解决方案,没有太多 "steps"...

导出密钥

export PRIVATE_KEY=`cat ./gitbu.2018-03-23.private-key.pem`

test.sh

#!/bin/bash

echo "$PRIVATE_KEY"; 

如果您想将密钥与其余环境变量一起保存到 .env 文件,您需要做的就是将私钥字符串“包裹”在 单引号中.env 文件中...例如:sh exports HELLO_WORLD='-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA04up8hoqzS1+APIB0RhjXyObwHQnOzhAk5Bd7mhkSbPkyhP1 ... iWlX9HNavcydATJc1f0DpzF0u4zY8PY24RVoW8vk+bJANPp1o2IAkeajCaF3w9nf q/SyqAWVmvwYuIhDiHDaV2A== -----END RSA PRIVATE KEY-----' 所以下面的命令将起作用:

echo "export PRIVATE_KEY='`cat ./gitbu.2018-03-23.private-key.pem`'" >> .env

其次是:

source .env

现在密钥将在您的 .env 文件中,每当您获取 .env 时,它都会被导出。

注意:为了使输出正常工作,我必须将环境变量用双引号引起来。否则它用空格替换换行符。

在:

export PRIVATE_KEY=$(cat ./gitbu.2018-03-23.private-key.pem)

输出:

echo "$PRIVATE_KEY"

如果要导出直接值(不是从 *.pem),请在等号后使用 "。终端会让你完成另一个 ".

export PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA04up8hoqzS1+
...
l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy==
-----END RSA PRIVATE KEY-----"

我想要的是一个且只有一个包含所有内容的可执行 shell 脚本,而不是 1 个脚本和 1 个 .pem 文件,然后在两者之间做一些体操,就像我在到目前为止的现有答案。

要实现这种统一,所需要的只是以下内容。准备阶段:

cat id_rsa | base64 -w0
# assign the converted 1-liner string wrap in single quote into a shell variable, for example
pk='xxxxxxxxxxxyyyyyyyyyyzzzzzzzzzzz......'

剩下的就是走在公园里。要使用变量 pk 进行 ssh,您会将 1-liner 字符串转换回其原始状态并写入临时文件。

t=$(mktemp ~/temp.XXXXXXXXXX)
printf $pk | base64 --decode > $t
ssh -i $t smeagol@192.143.69.69

要在 shell 脚本退出时清理临时文件,请添加 shell trap 处理程序:

trap cleanup 1 2 3 6
cleanup () {
    rm -f $t
}

为了提高安全性,请注意 mktemp ~/temp.XXXXXXXXXX 的使用,以便将临时文件写入您的 $HOME 文件夹中只有您可以阅读的某个位置,而不是系统范围内的 /tmp同一服务器中的其他用户可以读取的文件夹。

您还可以使用 bash heredoc:

export MY_CERTIFICATE=$(cat <<EOF
-----BEGIN CERTIFICATE-----
qiuwiuwoejqododhIOOISOIIOiiSNIDNIDINDIONDIND
DDHDHUDHDUHUhudhHQhhqoohooiiohihiohihhihhihi
dhdiodhioho...
-----END CERTIFICATE-----
EOF
)

设置后,您可以将其作为常规环境变量访问echo "$MY_CERTIFICATE"

正在将 RSA 密钥添加到 .env 文件。

步骤 1.

echo "PRIVATE_KEY=\"`sed -E 's/$/\\n/g' my_rsa_2048_priv.pem`\"" >> .env

您在 .env 文件中的密钥将如下所示:

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n
dasdasdadasdasdasdasdasdasdasdadasdasdadasa\n
huehuauhhuauhahuauhauahuauhehuehuauheuhahue\n
-----END RSA PRIVATE KEY-----\n"

第二步.打印PRIVATE_KEY只显示第一行。 将变量更改为单行。像这样:

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\ndasdasdadasdasdasdasdasdasdasdadasdasdadasa\nhuehuauhhuauhahuauhauahuauhehuehuauheuhahue\n-----END RSA PRIVATE KEY-----\n"

如果在应用内使用密钥 例如节点。
process.env.PRIVATE_KEY 会正确输出。

补充一点,更优雅的防呆方法是将环境变量编码为base64,然后在访问时对其进行解码。

const base64 = process.env.GITHUB_PRIVATE_KEY
const privateKey = Buffer.from(base64, 'base64')