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

nel*_*nic 21 environment-variables multiline private-key

我们的其中一个应用程序github-backup要求使用RSA私钥作为环境变量.

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

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

我做了一些谷歌搜索,但没有找到一个可行的解决方案...
例如:如何为AWS弹性豆设置多线RSA私钥环境变量

图片

错误: -----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=$2
name=$1
export $name="$(awk 'BEGIN{}{out=out$0"\n"}END{print out}' $file| sed 's/\n$//')"
Run Code Online (Sandbox Code Playgroud)

图片 然后运行以下命令:

source keytoenvar.sh PRIVATE_KEY ./gitbu.2018-03-23.private-key.pem
Run Code Online (Sandbox Code Playgroud)

有效但似乎是一种" 啰嗦 "的方法......

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

Tus*_*har 24

出口钥匙

export PRIVATE_KEY=`cat ./gitbu.2018-03-23.private-key.pem`
Run Code Online (Sandbox Code Playgroud)

test.sh

#!/bin/bash

echo $PRIVATE_KEY;
Run Code Online (Sandbox Code Playgroud)

如果要将密钥保存到.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
Run Code Online (Sandbox Code Playgroud)

其次是:

source .env
Run Code Online (Sandbox Code Playgroud)

现在,密钥将在您的.env文件中,并且每当您提供.env时,它都将被导出.

  • 正如这个答案 /sf/answers/3728993411/ 中所指出的,`echo $PRIVATE_KEY` 在显示输出时有时会删除所有换行符。我认为这取决于版本或回声的外壳。但是如果用双引号包裹,这个例子会更好更准确。 (3认同)

big*_*pan 15

您还可以使用 bash heredoc:

export MY_CERTIFICATE=$(cat <<EOF
-----BEGIN CERTIFICATE-----
qiuwiuwoejqododhIOOISOIIOiiSNIDNIDINDIONDIND
DDHDHUDHDUHUhudhHQhhqoohooiiohihiohihhihhihi
dhdiodhioho...
-----END CERTIFICATE-----
EOF
)
Run Code Online (Sandbox Code Playgroud)

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


Ami*_*.io 8

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

export PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA04up8hoqzS1+
...
l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy==
-----END RSA PRIVATE KEY-----"
Run Code Online (Sandbox Code Playgroud)

  • 我尝试过相同的操作,但不是读取完整密钥,而是将其读取为“``”-----BEGIN RSA PRIVATE KEY-----``` (3认同)
  • 是的,我已经尝试过这个,它不起作用,所以对我有用的是将所有新行替换为 '\n' 字符。 (2认同)

小智 8

我要补充的是,一种更优雅、万无一失的方法是将环境变量编码为 base64,然后在访问它时对其进行解码。

const base64 = process.env.GITHUB_PRIVATE_KEY
const privateKey = Buffer.from(base64, 'base64')
Run Code Online (Sandbox Code Playgroud)


typ*_*gic 6

我想要的是一个并且只有一个包含所有内容的可执行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......'
Run Code Online (Sandbox Code Playgroud)

其余的都是在公园散步。要使用变量ssh,pk您需要将1-liner字符串转换回其原始状态并写入临时文件。

t=$(mktemp)
printf $pk | base64 --decode > $t
ssh -i $t smeagol@192.143.69.69
Run Code Online (Sandbox Code Playgroud)

要清理,请使用trap

trap cleanup 1 2 3 6
cleanup () {
    rm -f $t
}
Run Code Online (Sandbox Code Playgroud)

为了提高安全性,请进行修改,mktemp以便将其写在$HOME文件夹中只能读取的位置,而不要写入/tmp同一服务器中其他用户可以读取的位置。


Bre*_*tty 5

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

在:

export PRIVATE_KEY=$(cat ./gitbu.2018-03-23.private-key.pem)
Run Code Online (Sandbox Code Playgroud)

出:

echo "$PRIVATE_KEY"
Run Code Online (Sandbox Code Playgroud)

  • 该死!!!这很棒,我一直在检查一个没有引号的变量,并一直得到 1 行(`echo $TEST | wc --lines`)。而且快疯了!!!感谢您提出这一建议,非常有助于确定它实际上确实包含所有行。 (3认同)
  • 另请注意,我刚刚意识到,`env` 总是正确显示变量,并带有换行符。 (2认同)

Mar*_*eca 5

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

第1步。

echo "PRIVATE_KEY=\"`sed -E 's/$/\\\n/g' my_rsa_2048_priv.pem`\"" >> .env
Run Code Online (Sandbox Code Playgroud)

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

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n
dasdasdadasdasdasdasdasdasdasdadasdasdadasa\n
huehuauhhuauhahuauhauahuauhehuehuauheuhahue\n
-----END RSA PRIVATE KEY-----\n"
Run Code Online (Sandbox Code Playgroud)

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

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\ndasdasdadasdasdasdasdasdasdasdadasdasdadasa\nhuehuauhhuauhahuauhauahuauhehuehuauheuhahue\n-----END RSA PRIVATE KEY-----\n"
Run Code Online (Sandbox Code Playgroud)

如果在应用程序中使用密钥,例如节点。
process.env.PRIVATE_KEY将正确输出。