Запуск 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+"/")