Как экспортировать многострочную переменную среды в Bash / Terminal, например: закрытый ключ RSA

Одно из наших приложений github-backup требует использования закрытого ключа RSA в качестве переменной среды.

Просто пытаюсь экспортировать ключ в терминал, например: text export PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA04up8hoqzS1+ ... l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy== -----END RSA PRIVATE KEY-----

Не работает ... из-за разрывов строк.

Я немного погуглил, но не нашел работоспособного решения ...
например: Как установить переменную среды многострочного закрытого ключа RSA для AWS Elastic Beans

Как экспортировать многострочную переменную среды в Bash / Terminal, например: закрытый ключ 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$//')"

Как экспортировать многострочную переменную среды в Bash / Terminal, например: закрытый ключ RSA затем выполнил следующую команду:

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

Это работает, но похоже на подход "многословный" ... ?

Кто-нибудь знает способ сделать это проще?
(Я надеюсь на решение "дружелюбный к новичкам" без лишних "шагов" ...)

У вашего сценария .sh возникла проблема: вы пытались использовать export $var (по ссылке / значению), но вместо этого должны были export var (по имени). В любом случае, ответ прост: bash допускает использование многострочных строковых литералов, если они заключены в кавычки. Используйте одинарные или двойные кавычки.

MarkHu 13.02.2019 17:46

@MarkHu Ваш подход не работает.

SFin 25.06.2019 10:36

Если я не неправильно понимаю, на что смотрю, вы опубликовали закрытый ключ на Stack Overflow, чтобы его мог увидеть весь мир. Прошел год, но если этот ключ все еще активен, вы должны его изменить.

rp.beltran 16.11.2019 02:30

@ rp.beltran длина ключа недостаточна для того, чтобы быть действующим закрытым ключом RSA. но спасибо за вашу заботу. :-)

nelsonic 18.11.2019 10:57

Хороший момент, мой плохой

rp.beltran 18.11.2019 11:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
58
5
56 348
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

экспортировать ключ

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, он будет экспортирован.

Как отмечено в этом ответе, stackoverflow.com/a/53271334/292408, echo $PRIVATE_KEY иногда удаляет все символы новой строки при отображении вывода. Я думаю, это зависит от оболочки, возможно, от версии или от эха. Но пример был бы лучше и точнее, если бы он был заключен в двойные кавычки.

Elijah Lynn 15.02.2019 02:41

Также следует отметить, что я только что понял, env всегда показывает переменные правильно, с новой строкой.

Elijah Lynn 15.02.2019 02:42

когда я пытаюсь получить доступ к своему ключу из файла .env, он возвращает только первую строку '----- BEGIN RSA PRIVATE KEY -----'

Marcelo Fonseca 23.05.2020 21:33

В этом случае я получаю только последнюю строку ключевого файла

Aman Prakash 04.06.2020 22:00

Я использую файл .env с проектом в Glitch, и заключение ключа в одинарные кавычки было единственным решением, которое сработало для меня ... Я искал некоторое время, так что спасибо !!

Tristan Bennett 17.09.2020 17:11

ПРИМЕЧАНИЕ: Чтобы вывод работал правильно, мне пришлось заключить переменную окружения в двойные кавычки. В противном случае он заменял новые строки пробелами.

В:

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

Вне:

echo "$PRIVATE_KEY"

ПРОКЛЯТИЕ!!! Это здорово, я продолжал проверять переменную без кавычек и получал 1 строку (echo $TEST | wc --lines). И сходил с ума !!! Спасибо, что предложили это, очень помогло определить, действительно ли в нем есть все линии.

Elijah Lynn 15.02.2019 02:39

Также следует отметить, что я только что понял, env всегда показывает переменные правильно, с новой строкой.

Elijah Lynn 15.02.2019 02:42

Если вы хотите экспортировать прямое значение (не из * .pem), используйте " после знака равенства. Терминал позволит вам закончить с другим ".

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

Я хотел только один исполняемый сценарий оболочки, содержащий все это, а не 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 вы преобразуете однострочную строку обратно в ее исходное положение и запишите во временный файл.

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, где другие пользователи того же сервера могут читать.

кодировка ключа base64 также оказалась для меня лучшим решением

jakxnz 27.08.2019 06:24

Вы также можете использовать bash heredoc:

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

После того, как вы его установите, вы можете получить к нему доступ как к обычной переменной env echo "$MY_CERTIFICATE".

Я пробовал это, но сертификат в одну строку, разрыва строки нет.

max johnson 20.07.2020 16:04

@max johnson: это справедливо, потому что апострофы отсутствуют. Попробуйте echo "$MY_CERTIFICATE". Это должно сработать.

Olli 18.12.2020 14:29

Простое и лучшее решение!

Jitesh Sojitra 11.02.2021 05:14

Добавление ключа 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 будет выводиться правильно.

Я добавлю, что более элегантный надежный способ - это закодировать env var как base64, а затем декодировать его при доступе к нему.

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

Другие вопросы по теме