Где оболочка входа в систему определяется?

Я читал различие между 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:~# 
16
задан 13 April 2017 в 05:23

3 ответа

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.

17
ответ дан 23 November 2019 в 02:31

Как @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, опции программы определяют, как эти различные типы корневой оболочки будут запущены:

enter image description here

11
ответ дан 23 November 2019 в 02:31

man bash:

оболочка входа в систему А является той, чей первый символ нуля аргумента -, или один запустился с --login опция.

man login:

значение для $HOME, $SHELL [...] установлены согласно соответствующим полям во вводе пароля.

Короче говоря:

  • оболочка А является оболочкой входа в систему, если она была вызвана как оболочка входа в систему.
  • переменная среды $SHELL установлена login или программой вызова, например su. Сама оболочка не устанавливает его.
  • shopt показывает варианты оболочки в настоящее время в действительности.
3
ответ дан 23 November 2019 в 02:31

Другие вопросы по тегам:

Похожие вопросы: