Почему пользователь $ sudo su UserB -c ‘printenv’ не печатает сведения о среде пользователя

#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 предоставляет дополнительную информацию об этом.