Как установить переменную окружения внутри команды управления Django (python-скрипт)
Я пытаюсь сделать команду управления Django, которая кэширует пароль SUDO пользователя и пароль ключа развертывания SSH, чтобы при втором запуске скрипта она не запрашивала их.
Однако основная причина проблемы заключается в том, что переменные окружения, установленные в дочерней оболочке, не сохраняются в родительской оболочке при выходе из дочерней оболочки, как объясняется здесь: Можно ли изменить окружение родительского процесса в Python?
Я не хочу записывать эту конфиденциальную информацию в файл. Как передать информацию от команды управления обратно в оболочку, чтобы при следующем запуске команды она могла получить доступ к кэшированным учетным данным? Когда оболочка выходит, она должна уничтожить кэшированную информацию.
Вот мой код, если кому-то интересно:
import os
from subprocess import run, PIPE, Popen
from getpass import getpass
from django.core.management.base import BaseCommand
SUDO_ENV_KEY = 'SUDO_PASSWORD'
GIT_ENV_KEY = 'GIT_PASSWORD'
class Command(BaseCommand):
def handle(self, **options):
# ----GET SUDO AUTH----
if not (sudo_pass := os.environ.get(SUDO_ENV_KEY)):
sudo_pass = getpass(f"Please enter sudo password: ")
os.environ[SUDO_ENV_KEY] = sudo_pass
# Send password via STDIN as bash history is insecure
command = ['echo', 'Getting sudo...']
p = Popen(['sudo', '-S'] + command, stdin=PIPE, stderr=PIPE, universal_newlines=True)
p.communicate(sudo_pass + '\n')[1]
# ----GET GIT AUTH----
if os.environ.get(GIT_ENV_KEY) != "True":
print('Adding GIT SSH deploy key...')
Cmd.run(['ssh-add', f'/home/username/.ssh/github'], check=True)
os.environ[GIT_ENV_KEY] = "True"
Я обошел эту проблему, установив время истечения срока действия SUDO очень большим, и можно проверить, был ли добавлен ключ ssh с помощью ssh-add -l
, и если он не был установлен, просто вызвать команду для его добавления.