#linux #shell #unix #environment-variables
#linux #оболочка #unix #переменные среды
Вопрос:
У меня есть два пользователя UserA и UserB.
Я хочу распечатать данные env для пользователя. Я запускаю приведенную ниже команду от пользователя.
userA$ sudo su userB -c 'printenv'
Но он печатает детали среды пользователя. Как это решить?
Если я переключусь на UserB и сделаю printenv
, то он напечатает сведения о среде пользователя, как и ожидалось. То же самое происходит с PYTHONPATH
и другими переменными.
Обратите внимание, что мне нужно выполнить подобную команду в одной команде. Я не могу сначала переключиться на UserB, а затем запустить printenv
.
Комментарии:
1. Я не уверен, но я думаю, что вам нужно ввести
su - userB
вместоsu userB
.2. это относится к суперпользователю
3. @DanielA. Белый: или Unix и Linux .
Ответ №1:
Вы должны использовать это:
userA$ sudo su - userB -c 'printenv'
su с дефисом (—) изменяет переменные среды на переменные нового пользователя в соответствии с их ~/.bashrc.
Ответ №2:
Вы, кажется, путаете свои концепции. Переменные среды принадлежат процессу, а не пользователю. У меня, как у пользователя, много процессов с разными средами.
Похоже, вы заинтересованы в поиске среды, которая была бы у оболочки входа пользователя. Для этого вы можете указать su
любую из -
, -l
, --login
командных опций:
-
,-l
,--login
Предоставьте среду, аналогичную той, которую ожидал бы пользователь, если бы пользователь вошел в систему напрямую.
Когда
-
используется, оно должно быть указано перед любым именем пользователя. Для переносимости рекомендуется использовать его в качестве последнего параметра перед любым именем пользователя. Другие формы (-l
и--login
) не имеют этого ограничения.
Имейте в виду, что файлы инициализации пользователя могут генерировать не совсем ту среду, которую вы получаете — например, если какая-либо инициализация зависит от типа терминала, от того, установлен ли $DISPLAY
параметр или от фазы луны.
Вам также следует подумать, sudo -i
что может дать более простую команду по сравнению с sudo su -
, с почти таким же эффектом.
Ответ №3:
Со страницы руководства su от июля 2014:
Рекомендуется всегда использовать
--login
опцию (вместо ее ярлыка-
), чтобы избежать побочных эффектов, вызванных смешиванием сред.
и
-
,-l
,--login
Запустите оболочку как оболочку входа в систему со средой, аналогичной реальному входу в систему:
- очищает все переменные среды, кроме
TERM
- инициализирует переменные среды
HOME
,SHELL
USER
,LOGNAME
,, иPATH
- изменения в домашнем каталоге целевого пользователя
- устанавливает
argv[0]
для оболочки значение ‘-
‘, чтобы сделать оболочку оболочкой входа
Когда оболочка является оболочкой входа, процесс ее запуска отличается от того, когда это интерактивная оболочка. Страница руководства bash предоставляет дополнительную информацию об этом.