Запуск сценария Python от имени пользователя root (с помощью sudo) - каково имя эффективного пользователя? - PullRequest
11 голосов
/ 19 апреля 2011

Я недавно начал использовать ConfigParser () для моих скриптов на python, чтобы добавить к ним некоторые функциональные возможности для конфигурационных файлов.Я знаю, как его использовать, но у меня есть проблема.Мой скрипт должен запускаться от имени пользователя root с использованием sudo.Файлы конфигурации находятся в ~/.config/scriptconfig/, но когда вы запускаете скрипт как sudo, он временно меняет пользователей на root, поэтому он не находит файлы конфигурации.Я хочу получить конфигурационный файл эффективного пользователя, чтобы он захватывал /home/myuser/.config/scriptconfig/config.cfg вместо /root/.config/scriptconfig/config.cfg, которого не существует.

Мне нужен сценарий, чтобыспособен работать на разных машинах, а не только на моей.Поэтому мне нужно получить домашний каталог эффективного пользователя

Вот пример кода, который я пытаюсь использовать:

<code>
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
Он должен вывести значение example из конфигурациифайл, но при запуске от sudo путь /home/root, поэтому он не находит файл конфигурации.

Ответы [ 3 ]

25 голосов
/ 23 июня 2011

Если вы запустите свой скрипт с помощью sudo (sudo myscript.py), тогда переменная окружения $USER будет root, а переменная окружения $SUDO_USER будет именем пользователя, выполнившего команду sudo myscript.py.Это следующее просто разъяснение предыдущего поста Седрика Жюльена.Рассмотрим следующий сценарий:

Пользователь Linux bob зарегистрирован в системе и обладает привилегиями sudo.Он пишет следующий скрипт Python с именем myscript.py:

    #!/usr/bin/python
    import os
    print os.getenv("USER")
    print os.getenv("SUDO_USER")

Затем он делает сценарий исполняемым с chmod +x myscript.py и затем выполняет свой сценарий с привилегиями sudo с помощью команды:

sudo ./myscript.py

Вывод этой программы будет (с использованием Python 2.xx):

    root
    bob

Если bob запустит программу без привилегий sudo с

./myscript.py

он получит следующий вывод:

    bob
    None
5 голосов
/ 22 апреля 2011

если вы хотите получить пользователя, который вошел в систему до запуска команды sudo, он сохраняется в переменной среды SUDO_USER.

import os
sudo_username = os.getenv("SUDO_USER")
home_dir = "/home/" + sudo_username

У вас также есть SUDO_UID и SUDO_GID для идентификатора пользователя и идентификатора группы.

4 голосов
/ 20 апреля 2011

Это не работает.

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+"/")
...