Запуск Python script как root (с sudo) - что является именем пользователя эффективного пользователя?
Недавно я начал использовать ConfigParser() для своих сценариев python, чтобы добавить к ним некоторые функции для файлов конфигурации. Я знаю, как использовать его, но у меня проблема. Мой script должен запускаться как пользователь root, используя sudo. Конфигурационные файлы находятся в ~/.config/scriptconfig/
, но при запуске script в качестве sudo он временно изменяет пользователей на root, поэтому он не находит файлы конфигурации. То, что я хочу сделать, это получить конфигурационный файл эффективного пользователя, чтобы он хватал /home/myuser/.config/scriptconfig/config.cfg
вместо /root/.config/scriptconfig/config.cfg
, которого не существует.
Мне нужен script, чтобы работать на разных машинах, а не только на моем. Поэтому мне нужно получить домашний каталог эффективного пользователя
Вот пример кода, который я пытаюсь использовать:
import os, ConfigParser
config = ConfigParser.RawConfigParser()
homepath = os.path.expanduser("~/")
configpath = homepath + ".config/scriptconfig/config.cfg"
config.read(configpath)
get = config.get('Config', 'Example')
print get
It should print the value of
example
from the config file but when ran as sudo, the path is
/home/root
so it doesn't find the config file.
Ответы
Ответ 1
Если вы запустите свой script с помощью sudo (sudo myscript.py
), то переменная среды $USER
будет root
, а переменная среды $SUDO_USER
будет именем пользователя, выполнившего команду sudo myscript.py
, Следующее - это просто разъяснение предыдущей статьи Седрика Жюльена. Рассмотрим следующий сценарий:
Пользователь linux bob
регистрируется в системе и обладает привилегиями sudo. Он пишет следующий python script с именем myscript.py
:
#!/usr/bin/python
import os
print os.getenv("USER")
print os.getenv("SUDO_USER")
Затем он выполняет script исполняемый файл с chmod +x myscript.py
, а затем выполняет свой script с правами sudo с помощью команды:
sudo ./myscript.py
Вывод этой программы будет (с использованием python 2.x.x):
root
bob
Если bob запускает программу sans sudo с помощью
./myscript.py
он получит следующий результат:
bob
None
Ответ 2
если вы хотите, чтобы пользователь, который был зарегистрирован перед запуском команды sudo, хранится в переменной среды SUDO_USER.
import os
sudo_username = os.getenv("SUDO_USER")
home_dir = "/home/" + sudo_username
У вас также есть SUDO_UID и SUDO_GID для идентификатора пользователя и идентификатора группы.
Ответ 3
Это не работает.
homepath = os.path.expanduser("~/")
Поэтому не используйте его.
Вы хотите это.
username= os.environ["LOGNAME"]
homepath = os.path.expanduser("~"+username+"/")
http://docs.python.org/library/os.html#os.getlogin
Или, возможно, это.
username= pwd.getpwuid(os.getuid())[0]
homepath = os.path.expanduser("~"+username+"/")