Как установить переменную окружения внутри команды управления 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, и если он не был установлен, просто вызвать команду для его добавления.

Вернуться на верх