Как экспортировать переменную многострочной среды в Bash/Terminal, например: RSA Private Key
В одном из наших приложений github-backup
требуется использование RSA Private Key в качестве переменной среды.
Просто попытайтесь экспортировать ключ в терминал, например: text export PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA04up8hoqzS1+... l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy== -----END RSA PRIVATE KEY-----
Не работает... из-за разрыва строки.
Я немного поработал с поиском, но не нашел подходящего решения...
например: Как установить многострочную переменную среды частного ключа RSA для 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
Это работает, но это похоже на "длинный" подход... 🤔
Кто-нибудь знает более простой способ сделать это?
(Я надеюсь на " удобное для начинающих " решение без слишком много "шагов"...)
Ответы
Ответ 1
экспортировать ключ
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, он будет экспортироваться.
Ответ 2
Если вы хотите экспортировать прямое значение (не из *.pem), используйте "
после знака равенства. Терминал позволит вам закончить с другим "
.
export PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA04up8hoqzS1+
...
l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy==
-----END RSA PRIVATE KEY-----"
Ответ 3
ПРИМЕЧАНИЕ. Для правильной работы вывода мне пришлось заключить переменную среды в двойные кавычки. В противном случае он заменял символы новой строки пробелами.
В:
export PRIVATE_KEY=$(cat ./gitbu.2018-03-23.private-key.pem)
Из:
echo "$PRIVATE_KEY"
Ответ 4
То, что я хотел, - это один и только один исполняемый скрипт оболочки, содержащий все это, а не 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......'
Остальное - прогулка в парке. В ssh, используя переменную pk
вы конвертируете строку из 1 строки в исходное положение и записываете во временный файл.
t=$(mktemp)
printf $pk | base64 --decode > $t
ssh -i $t [email protected]
Для очистки используйте trap
:
trap cleanup 1 2 3 6
cleanup () {
rm -f $t
}
Чтобы повысить безопасность, измените mktemp
так что пишите где-нибудь в вашей папке $HOME
где только вы можете читать, а не в /tmp
где другие пользователи на том же сервере могут читать.
Ответ 5
Вы также можете использовать bash heredoc:
export MY_CERTIFICATE=$(cat <<EOF
-----BEGIN CERTIFICATE-----
qiuwiuwoejqododhIOOISOIIOiiSNIDNIDINDIONDIND
DDHDHUDHDUHUhudhHQhhqoohooiiohihiohihhihhihi
dhdiodhioho...
-----END CERTIFICATE-----
EOF
)
После того, как вы установите его, вы сможете получить к нему доступ как к обычной переменной env echo $MY_CERTIFICATE
.