В Linux C ++, как вы читаете переменную окружения указанного пользователя? - PullRequest
1 голос
/ 24 октября 2011

Я знаю, что getenv () возвращает значение указанной переменной среды текущего пользователя, но мой код требует привилегий root, поэтому getenv () будет использовать только переменные среды sudo.Я также знаю, что SUDO_USER сообщает, какой пользователь вызывает sudo. Это пользовательская среда, которую я хочу использовать для getenv ().

char* gnome_env_var = getenv("GDMSESSION"); //returns null as not found in sudo env
char* usr = getenv("SUDO_USER");

Есть ли способ получить значение переменной среды для зарегистрированногопользователь, а не среда sudo?

EDIT Хорошо, так что я слышал, что набор переменных среды уникален для каждого процесса, а не пользователя, и использование sudo для вызоваПроцесс с привилегиями root вызывает execve, который может создать совершенно новый набор переменных среды для этого процесса.Итак, перефразируя, есть ли способ кроме перебора файлов sudoers и в текущем процессе поиска переменных окружения вызывающего процесса?

Мне особенно нужна переменная среды GDMSession.

Ответы [ 2 ]

6 голосов
/ 24 октября 2011

getenv не говорит вам о переменных окружения текущего пользователя , но о текущем процессе . Пользователи могут иметь столько сред, сколько они хотят (и могут создавать процессы), например, с помощью встроенной оболочки export. При каждом вызове execve вызывающая программа может создавать совершенно новую среду для выполняемого процесса.

Следовательно, нет способа получить переменные окружения пользователя или даже тех, кто выполняет процесс sudo. Почему Вы хотите этого в любом случае?

Однако вы можете настроить sudo для сохранения некоторых или всех переменных среды с помощью директив keep_env и reset_env в /etc/sudoers.

4 голосов
/ 24 октября 2011

Не существует "пользовательской среды". Каждый процесс имеет свою собственную копию переменных среды.Они даже автоматически не наследуют - то, что они кажутся , является иллюзией, поддерживаемой оболочкой и библиотекой C.Точнее думать о них как о втором наборе аргументов командной строки для каждой программы.

Итак, прежде чем мы сможем ответить на ваш вопрос, вам нужно выяснить, что вы имеете в виду!Существуют возможности - ни одна из них не элегантна, ум, но они существуют - но они решающим образом зависят от того, какая переменная среды вы хотите получить, в каком состоянии процесса и почему.

...