Получить переменную окружения другого пользователя [закрыто]

23

Есть ли способ увидеть переменную окружения другого пользователя? Я хочу сделать это как root, так что разрешения не будут проблемой, я думаю.

Для самого пользователя я использую echo $PATHили set | grep PATH(или setкогда я не помню имя переменной). Какова будет аналогичная инструкция для другого пользователя?

Для чего это стоит, я на Ubuntu Server 13.04.


источник
4
У пользователей нет переменных окружения, процессы есть. Обычно процессы, выполняемые одним пользователем, не имеют одинаковой среды. Какую проблему ты пытаешься решить?
Жиль "ТАК - перестать быть злым"
@ Жиль, например, я хочу знать, какая папка MAIL у пользователя. Я мог войти как этот пользователь, затем сделать echo $MAIL, но я подумал, что может быть ярлык.
3
Это все еще не определяет вопрос с пользой (и, например, ответ, который вы приняли, может или не может работать в зависимости от множества факторов). Вы ищете местоположение почтового ящика по умолчанию? Вы ищете место, где пользователь фактически получает свою локальную почту (которая может отличаться и может не существовать, если у пользователя есть .forward)? Пользователи часто устанавливают несколько переменных в своих .profileили других файлах конфигурации, и нет способа надежно перечислить их все. Опять же, какую проблему вы пытаетесь решить?
Жиль "ТАК ... перестать быть злым"

Ответы:

20

Другим вариантом является использование env. Запустите это как root:

sudo -Hiu $user env | grep $var

Например

sudo -Hiu terdon env | grep HOME
HOME=/home/terdon
Тердон
источник
1
Когда я вхожу в систему как root и выполняю эту команду для моего стандартного имени пользователя, я получаю HOME=/root. Это домашний каталог root, но это не мой стандартный домашний каталог. Если вы хотите знать среду, которую конкретный пользователь получит при входе в систему, вы должны запустить сценарии запуска оболочки входа этого конкретного пользователя (и помните, что его оболочка входа может отличаться от вашей оболочки входа).
Уве
@ У нас в какой системе? Он отлично работает для меня. Вы имеете в виду, что вы входите как rootиз менеджера входа? Работает нормально, если я захожу на tty и захожу как root.
Terdon
Я на машине Debian. Я захожу как uwe, открываю xterm, запускаю env | grep HOMEи получаю HOME=/home/uwe; Я выполняю, suа затем еще раз env | grep HOMEи получаю HOME=/root, затем я бегу sudo -u uwe env | grep HOMEи все еще получаю HOME=/root.
Уве
@ странно. Я также на машине Debian (LMDE), я сделал тот же процесс, который вы описали (даже использовал xtermвместо моего обычного терминала) и получил ожидаемый результат.
Terdon
В соответствии с руководством sudoустанавливает переменную HOME только в том случае, если -Hопция присутствует или если установлена ​​соответствующая запись в /etc/sudoers. Кажется, что наши файлы sudoers отличаются. Во всяком случае, это, вероятно, хорошая идея, чтобы использовать -Hздесь, и, возможно, также -i.
Уве
2

Для одного пользователя вы можете сделать так:

su - <username> -c '. ~/.profile; echo $PATH'

Список $ PATH всех пользователей:

for user in $(cat /etc/passwd | awk -F: '{print $1}'); do
  su - $user -c '. ~/.profile; printf "%s\n" "$PATH"'
done

@Camil Staps

. ~/.profileТаким образом, уловка, которую я учу у моего любимого человека, Петерис Круминьш. Он объяснил трюк здесь . Может быть, позже у версии bash была возможность сборки NON_INTERACTIVE_LOGIN_SHELLS.

cuonglm
источник
Благодарность! Для $PATHэтого также работает без . ~/.profile; части - для чего это?
@CamilStaps Что вы подразумеваете под "это работает"? Да, вы получаете значение $PATHдаже без использования источников ~/.profile, но это почти наверняка не то, что вам нужно (= значение, которое этот пользователь увидит при входе в систему). Даже поиск ~/.profileне полностью надежен, так как пользователь может использовать оболочку, чей файл запуска отличается от ~/.profile.
Уве
@ У меня получился такой же вывод без, но я думаю, это просто совпадение.
Вы предполагаете, что пользователь не использует csh.
Гленн Джекман
@CamilStaps Первый вопрос заключается в том, изменяет ли этот конкретный пользователь свой PATH в своем ~/.profile. Но в любом случае поведение sudoможет быть настроено довольно сильно /etc/sudoers(см. Мое обсуждение с terdon), поэтому, когда наши системы ведут себя по-разному, это, вероятно, вызвано различиями в файлах конфигурации.
Уве
0

Из root вы можете su -перейти к пользователю, а затем выполнить grep для переменной среды, которую хотите увидеть:

su - <username> -c 'echo $PATH'

Раза
источник
по какой-то причине это не работает для меня, даже если команда выполняется от имени другого пользователя. Я закончил тем, что использовал "env", так что sth like runuser -l <username> -c "env | grep <var>" | cut -d '=' -f 2отлично работает для меня. Если вы не root, нужно поставить префикс команды с sudo.
Андрей-Никулае Петр