如何在 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')
我们的一个应用程序 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')