У меня есть сценарий резервного копирования bash, выполняемый как root (cron), который делегирует определенные задачи другим скриптам bash, принадлежащим разным пользователям. (Упрощенный пример, принцип, некоторые вещи, которые нужно сделать в корне различные задачи делегируются для пользователей с соответствующей средой (оракула, амазонка, ...)Настройка среды при изменении на другого пользователя
mkdir -p /tmp/backup$NAME
su - oracle -c "~/.backups/export-test.sh"
tar cf /tmp/backup/$NOW.tar /tmp/backup$NAME
su - amazon upload_to_amazon.sh /tmp/backup/$NOW.tar
Этот скрипт сам делает то некоторые задачи, пользователь оракул:
mkdir -p $TMP_LOCATION
cd ~/.backups
exp $TMP_LOCATION/$NAME-$NOW
когда я пытаюсь имитировать это поведение в Python я придумал следующее (начал с хрон как корень)
name = "oracle"
# part run as root
os.makedirs(tmp_backup + name)
os.setegid(pwd.getpwnam(name)[3])
os.seteuid(pwd.getpwnam(name)[2])
# part run as oracle
os.makedirs(tmp_location)
os.chdir(os.path.expanduser("~{user}/.backups".format(user=name)))
subprocess.check_call(["exp",
"os.path.join(tmp_location, name+'-'+now)"
])
в Баш при использовании су -, вызывается реальная новая оболочка и устанавливаются все переменные среды этого пользователя. Как я могу улучшить это для моего скрипта python? Есть ли стандартный рецепт, которым я могу следовать? Я думаю о переменных окружения, umask, ...
Окружающая среда Solaris, если это может иметь значение.
Что касается (1), вы можете выполнить .profile как подпроцесс целый день, и это не будет изменять окружение родителя - на самом деле это не вариант. (3) лучше, но страдает от потенциальной проблемы, что переменные окружения оракула могут быть перезаписаны амазонами. – bstpierre
(3) не создает разделение пользовательских окружений: при запуске части оракула ключи амазонки также находятся в окружении – Joram
@ Джорам: Итак? Какая проблема? –