Я читал различие между sudo -i/-s
здесь. После использования команды shopt
отмечено что все (sudo su/sudo -i/sudo -s
) $SHELL
обеспечивают те же результаты, но shopt
результаты команды отличаются.
Так, как вход в систему и не определенная оболочка входа в систему?
От где shopt
получить результат?
Почему это не связано с $SHELL
?
sudo su
givinv@87-109:~$ sudo su
root@87-109:/home/givinv#
root@87-109:/home/givinv#
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv#
root@87-109:/home/givinv# exit
givinv@87-109:~$
sudo-i
givinv@87-109:~$ sudo -i
root@87-109:~#
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
sudo-s
root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
TL; DR:
/etc/passwd
.sudo su
/sudo su -
/sudo -i
/sudo -s
то же? Нет, они все порождают оболочку, но по-другому и в различных контекстах.$SHELL
? Просто скажите свою оболочку по умолчанию, то же как в /etc/passwd
.Фактический ответ:
В первую очередь, важно упомянуть это shopt
является определенным для удара. Например, я mksh
окружите пользователя, и это не имеет shopt
, точно так же, как ksh
не делает.
Затем, что точно login_shell
как предполагается, представляет? От man bash
:
login_shell
Оболочка устанавливает эту опцию, если она запускается как оболочка входа в систему
Это - ключевой пункт. sudo -i
, как Вы уже знаете из предыдущего ответа, который Вы читаете, как предполагается, моделирует начальный вход в систему. Вот почему shopt
отчеты login_shell on
для этой опции. Думайте об этом как будто sudo -i
вынуждает оболочку пройти файлы, которые, как предполагается, появляются только во время процесса входа в систему (которые не становятся полученными интерактивными оболочками).
В других случаях Вы уже выполняете экземпляр оболочки, таким образом, это не может быть оболочка входа в систему во-первых, и цель опций отличается. sudo -s
просто чтения $SHELL
(который предназначен для представления оболочки по умолчанию, как начато /etc/passwd
) переменная и выполнения это с полномочием пользователя root. Это эквивалентно выполнению sudo $SHELL
или sudo mksh
или sudo bash
(какой бы ни Вы, оказывается, используете).
Помните, что я упомянул, что я mksh
пользователь? Смотрите на это:
$ bash --posix
bash-4.3$ sudo -s
[sudo] password for xieerqi:
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id
uid=0(root) gid=0(root) groups=0(root)
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU
То, что Вы видите, является этим sudo -s
спрыгнувший bash
к моему mksh
оболочка, с характерной подсказкой я установил для него. И конечно, так как это не действие входа в систему, для bash
это сообщило бы, что оболочка порождена как не - экземпляр оболочки входа в систему. В моем случае, однако, Вы видите это $-
не имеет буквы l
там, который был бы там, если бы это было экземпляром оболочки входа в систему.
Наконец, та же идея относится sudo su
и sudo su -
. Позже каждый порождает экземпляр оболочки входа в систему (т.е. определенные файлы, которые требуются для входа в систему, будет работать), и прежний порождает только интерактивные оболочки (т.е. файлы входа в систему не работают).
bash-4.3$ sudo su
[sudo] password for xieerqi:
root@eagle:/home/xieerqi# shopt login_shell
login_shell off
root@eagle:/home/xieerqi# exit
bash-4.3$ sudo su -
[sudo] password for xieerqi:
$ shopt login_shell
login_shell on
Так технически, shopt login_shell
не имеет никакого отношения к $SHELL
безотносительно. Думайте о нем этот путь: его цель состоит в том, чтобы показать, как удар работает. $SHELL
как предполагается, отражает только, в чем Вы присвоились /etc/passwd
.
Что касается различия между оболочкой входа в систему и оболочкой невхода в систему, это было объяснено весьма уважаемым Gilles на unix.stackexchange.com в этом ответе.
Дополнительная забава
Вот является что-то забавой, которую можно попробовать. Как можно уже знать, оболочка входа в систему будет работать .profile
(и .bashrc
начиная с Ubuntu .profile
настроен, чтобы сделать так), но ад нелогинов будет работать только .bashrc
файл. Таким образом, мы можем протестировать с echo
какая из этих команд выполняет оболочку входа в систему и который не делает, и мы ожидаем две строки echo
для оболочки входа в систему и только одного для невхода в систему.
$ echo "echo 'hi,i am .profile'" >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ sudo -i
hi, i am .bashrc
hi,i am .profile
$ sudo su
hi, i am .bashrc
root@eagle:~# sudo su -
hi, i am .bashrc
hi,i am .profile
$ sudo -s
hi, i am .bashrc
root@eagle:~#
Соответственно достаточно те, которые имеют две строки вывода, будут иметь login_shell
набор к on
.
Как @Serg объясняет в этом ответе о том, как сказать то, что окружает Вас, работают , SHELL
, переменная является просто текущим пользователем значение по умолчанию оболочка, как считано от /etc/passwd
:
$ grep zanna /etc/passwd
zanna:x:1000:1000:Zanna,,,:/home/zanna:/bin/bash
поэтому, если я echo $SHELL
это будет всегда возвращаться /bin/bash
:
$ zsh
% echo $SHELL
/bin/bash
, Является ли оболочка оболочкой входа в систему, , эль sh выбирает ион, определенный в то время, когда оболочка запускается. Программная оболочка хранит эту информацию наряду со всеми своими другими настройками и переменными. Эти shopt
команда позволяет видеть эту информацию и, если это возможно, для рассматриваемой опции, устанавливать или сбрасывать его (это не имеет место для login_shell
, который, конечно, зависит от процесса, используемого для запуска оболочки)
sudo
, опции программы определяют, как эти различные типы корневой оболочки будут запущены:
man bash
:
оболочка входа в систему А является той, чей первый символ нуля аргумента
-
, или один запустился с--login
опция.
man login
:
значение для
$HOME
,$SHELL
[...] установлены согласно соответствующим полям во вводе пароля.
Короче говоря:
$SHELL
установлена login
или программой вызова, например su
. Сама оболочка не устанавливает его. shopt
показывает варианты оболочки в настоящее время в действительности.