Отримати змінну середовища іншого користувача [закрито]


23

Чи є спосіб я бачити змінну середовища іншого користувача? Я хочу зробити це як корінь, тому дозволи на допущення не будуть проблемою.

Для самого користувача я використовую echo $PATHабо set | grep PATH(або setколи я не пам'ятаю ім'я змінної). Що було б подібною інструкцією для іншого користувача?

Для чого це варто, я перебуваю на Ubuntu Server 13.04.


4
Користувачі не мають змінних середовищ, як це роблять процеси. Для процесів, що виконуються одним користувачем, звичайно, що не всі мають однакове середовище. Яку проблему ви намагаєтеся вирішити?
Жил "ТАК - перестань бути злим"

@Gilles, наприклад, я хочу знати, яку папку 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.
Уве

@uwe дивно. Я також на машині Debian (LMDE), я здійснив точно той же процес, який ви описали (навіть використовувався xtermзамість мого звичайного терміналу) і отримав очікуваний результат.
тердон

Відповідно до посібника, sudoвстановлює змінну HOME, лише якщо -Hпараметр присутній або якщо встановлено відповідний запис /etc/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.


Спасибі! Бо $PATHце також працює без . ~/.profile; частини - для чого це?

@CamilStaps Що ви маєте на увазі під "це працює"? Так, ви отримуєте значення для $PATHнавіть без пошуку ~/.profile, але це майже напевно не те, яке ви хочете (= значення, яке побачив би цей користувач під час входу в систему). Навіть джерело пошуку ~/.profileне є повністю надійним, оскільки користувач може використовувати оболонку, файл запуску якого відрізняється від ~/.profile.
Уве

@У нас же вийшов такий самий вихід, але, мабуть, тоді це просто збіг.

Ви припускаєте, що користувач не використовує csh.
glenn jackman

@CamilStaps Перше питання полягає в тому, чи змінює конкретний користувач свій PATH у своїх ~/.profile. Але в будь-якому випадку поведінку sudoможна досить налаштувати /etc/sudoers(див. Мою дискусію з тердоном), тому коли наші системи поводяться по-різному, це, ймовірно, викликано різницями у файлах конфігурації.
Уве

0

від root ви можете su -користувачеві, а потім перетягніть змінну середовища, яку ви хочете бачити:

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


чомусь це не працює для мене, навіть якщо команда виконується як інший користувач. Я в кінцевому підсумку використовував "env", так що, начебто, runuser -l <username> -c "env | grep <var>" | cut -d '=' -f 2добре працює для мене. Якщо ви не root, потрібно встановити команду префікса sudo.
Андрій-Нікулае Петре
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.