Почему 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/bash
  • monty имеет неопределенную оболочку, которая должна по умолчанию /bin/sh как показано в /etc/default/useradd файл
    • это подкрепляется sshing в monty и проверкой оболочки
  • кроме того, странно, почему с помощью su monty SHELL переменная 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
Другие вопросы по тегам