Почему su сохраняет SHELL=/bin/bash в этом случае?
Я экспериментировал с переключением пользователей с su команда. Я запутался, почему Су несу SHELL переменная окружения для пользователя monty, Упражнение показано ниже:
vagrant@cats:/home$ cat /etc/passwd | grep -E "monty|vagrant"
vagrant:x:900:900:vagrant,,,:/home/vagrant:/bin/bash
monty:x:1000:1002::/home/monty:
vagrant@cats:/home$ cat /etc/default/useradd | grep SHELL
# The SHELL variable specifies the default login shell on your
SHELL=/bin/sh
vagrant@cats:/home$ echo $SHELL
/bin/bash
vagrant@cats:/home$ ssh monty@localhost
monty@localhost's password:
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-31-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Last login: Wed Sep 28 17:34:36 2016 from ::1
$ echo $SHELL
/bin/sh
$ exit
Connection to localhost closed.
vagrant@cats:/home$ su monty
Password:
monty@cats:/home$ echo $SHELL
/bin/bash
monty@cats:/home$ exit
exit
Как видно выше:
- Есть как минимум два пользователя
vagrantа такжеmonty vagrantимеет указанную оболочку/bin/bashmontyимеет неопределенную оболочку, которая должна по умолчанию/bin/shкак показано в/etc/default/useraddфайл- это подкрепляется sshing в monty и проверкой оболочки
- кроме того, странно, почему с помощью
su montySHELLпеременная env остается как/bin/bash
Эта последняя пуля - главная причина, по которой я запутался. Взглянув на man su кажется, тоже не помогает, обратите внимание на -s флаг:
-s, --shell SHELL
The shell that will be invoked.
The invoked shell is chosen from (highest priority first):
The shell specified with --shell.
If --preserve-environment is used, the shell specified by the $SHELL environment variable.
The shell indicated in the /etc/passwd entry for the target user.
/bin/sh if a shell could not be found by any above method.
Спускаясь по списку:
- Я не использовал
-sили же--shellфлаг, так что ничего не объясняет - Я также не использовал
--preserve-environmentпереключатель, который объясняет ситуацию, но не потому, что я не использовал его - Там нет оболочки в
/etc/passwdдля целевого пользователя, что должно означать, что по умолчанию/bin/shтак что это не поможет - Было бы разумно, если бы отсутствовала запись и все вышеперечисленные помехи или переключатели, чтобы ничего не было найдено, кроме
/bin/shбудет использоваться... что это не так, так что это тоже не поможет
Так что я действительно сбит с толку, кажется, что я буквально вижу совершенную инверсию любого поведения, которое можно ожидать после прочтения каждого файла конфигурации и записи man по этой проблеме, ха-ха.
Хотелось бы немного помощи и руководства:)
Изменить: см. Ответ и комментарий ниже. Также см. Первый и второй до последнего абзаца в разделе ОПИСАНИЕ на странице руководства.
ОПИСАНИЕ
... Необязательный аргумент - может использоваться для предоставления среды, аналогичной той, которую пользователь ожидал бы, если бы пользователь вошел в систему напрямую.
...
Текущая среда передается в новую оболочку...
1 ответ
su по умолчанию сохраняет среду текущего пользователя при переключении на другого пользователя, включая оболочку текущего пользователя.
Чтобы использовать среду и конфигурацию целевого пользователя, вам нужно запустить оболочку входа, добавив -l/--login вариант или просто -:
su - monty