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

1hdlvixo  于 2023-08-07  发布在  Shell
关注(0)|答案(6)|浏览(101)

我们的一个应用程序github-backup需要使用RSA私钥作为环境变量。
简单地尝试在终端中导出密钥,例如:text export PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA04up8hoqzS1+ ... l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy== -----END RSA PRIVATE KEY-----
不起作用...因为断线了
我做了一点谷歌搜索,但没有找到一个可行的解决方案...
例如:How to set multiline RSA private key environment variable for AWS Elastic Beans


的数据
错误:-----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$//')"

字符串


然后运行以下命令:

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


这是一种“长时间”的方法,但它似乎是一种“长时间”的方法。🤔
有没有人知道一个更简单的方法来做到这一点?
(* 我希望有一个“初学者友好”的解决方案,没有太多的“步骤”...*)

5cnsuln7

5cnsuln71#

导出密钥

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

字符串

test.sh

#!/bin/bash

echo "$PRIVATE_KEY";

**注意:**以上echo中的"是必须的,否则新行将转换为空格!

如果您想将密钥与其他环境变量一起保存到.env文件中,您所需要做的就是在.env文件中用 * 单引号 *“ Package ”私钥字符串…例如: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时,它将被导出。

3lxsmp7m

3lxsmp7m2#

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

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

字符串

vktxenjb

vktxenjb3#

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

于:

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

字符串
输出:

echo "$PRIVATE_KEY"

slmsl1lt

slmsl1lt4#

我想要的是一个且只有一个包含所有内容的可执行shell脚本,而不是一个脚本和一个.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,您需要将一行字符串转换回其原始状态并写入临时文件。

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文件夹中。

ykejflvf

ykejflvf5#

将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"


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

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


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

mf98qq94

mf98qq946#

我还要补充一点,一种更优雅、更简单的方法是将env var编码为base64,然后在访问它时对其进行解码。

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

字符串

相关问题