Различать Интерактивный вход в систему и неинтерактивную оболочку без входа в систему
25
Я пытаюсь разграничить эти четыре условия: вход в систему, не вход в систему, интерактивный и неинтерактивный :
интерактивный - оболочка входа
интерактивная оболочка без авторизации
неинтерактивный - оболочка входа
неинтерактивный - оболочка без входа в систему
Как я понимаю, интерактивная оболочка без входа в систему : запустите систему, войдите в систему и откройте терминал, а неинтерактивная - войдите в систему : войдите в систему и войдите в систему.
Но как насчет интерактивной оболочки?
Вход в систему, открытие виртуального терминала и вход в систему? и
неинтерактивный - оболочка без входа в систему, запускается ли автоматический сценарий в crontab?
Единственное реальное заблуждение, которое у вас, по-видимому, заключается в том, что представляет собой неинтерактивную оболочку входа в систему.
Кратко (см. Здесь для более подробной информации), с примерами:
интерактивная оболочка для входа в систему: вы, например, входите в удаленный компьютер ssh. Кроме того, вы переходите на tty на локальном компьютере ( Ctrl+ Alt+ F1) и входите в систему там.
интерактивная оболочка без авторизации: откройте новый терминал.
Неинтерактивная оболочка без входа в систему: Запустите скрипт. Все сценарии работают в своей собственной оболочке, и эта оболочка не является интерактивной. Он открывается только для выполнения сценария и закрывается сразу после завершения сценария.
неинтерактивная оболочка для входа в систему: это крайне редко, и вам не нравится сталкиваться с ней. Одним из способов запуска является echo command | ssh server. Когда sshзапускается без команды (то есть sshвместо того, ssh commandчтобы запускаться commandна удаленной оболочке), он запускает оболочку входа в систему. Если stdinthe sshне является tty, запускается неинтерактивная оболочка. Вот почему echo command | ssh serverзапустит неинтерактивную оболочку входа в систему. Вы также можете начать с bash -l -c command.
Если вы хотите поиграть с этим, вы можете проверить различные типы оболочки следующим образом:
Является ли эта оболочка интерактивной?
Проверьте содержимое $-переменной. Для интерактивных оболочек это будет включать i:
## Normal shell, just running a command in a terminal: interacive
$ echo $-
himBHs## Non interactive shell
$ bash -c 'echo $-'
hBc
Это оболочка для входа?
Нет портативного способа проверить это, но для bash вы можете проверить, установлена ли login_shellопция:
## Normal shell, just running a command in a terminal: interacive
$ shopt login_shell
login_shell off## Login shell;
$ ssh localhost
$ shopt login_shell
login_shell on
Собирая все это вместе, вот один из возможных типов оболочки:
## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell off## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell on## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell off## Non-interactive login shell
$ echo 'echo $-; shopt login_shell'| ssh localhostPseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell on
Я хочу пояснить, что: 1) Для меня вход в систему с графическим интерфейсом пользователя означает запуск системы, вход в систему и открытие терминала. 2) Выполнение telnet или ssh - это интерактивная оболочка входа в систему non-interactive login shell.
ромашка
@daisy спасибо за разъяснения; ответ отредактирован.
тердон
хорошо и графический интерфейс не имеет никакого значения, интерактивная , не Войти оболочка: просто открыть новый терминал локально или удаленно через телнет или SSH
маргаритки
@ Даиси да, звучит о праве. Но, пожалуйста, внимательно прочитайте ответ Муру, поскольку это объясняет, что, по сути, это вопрос семантики и влияет только на то, какие файлы запуска читаются оболочкой. Также см. Здесь для более полного обзора различных типов оболочки.
тердон
Неинтерактивные оболочки входа в систему не так уж редки, например, Git использует их, IIRC.
Quazgar
7
По сути, является ли оболочка логином или нет, интерактивной или нет, имеет значение только по одной причине:
Файлы инициализации и набор параметров по умолчанию зависят от того, является ли оболочка логином или нет, интерактивной или нет.
Соответственно, является ли оболочка логином или нет, интерактивной или нет, зависит исключительно от используемого вызова - точного имени команды и параметров.
Два свойства являются ортогональными, независимо от того, является ли оболочка логином или нет, не имеет отношения к определению, является ли она интерактивной или нет.
Bash запускает оболочку входа в систему, если любое из них верно:
argv[0]имя команды, с которой она была вызвана, начинается с -
-lзадана опция
Аналогично, bash запускает интерактивную оболочку, если любое из них верно:
не был указан файл для выполнения (т. е. команда не была bash some/file) или строка команды для запуска ( bash -c 'foo') (фактическое условие немного сложнее, см. руководство)
-iбыла указана опция
Причем (как это ни парадоксально) последнее подразумевает, что bash -ic 'foo'запускается интерактивная оболочка.
Таким образом, следующее запускает интерактивную оболочку входа в систему, даже если она не имеет ничего общего с интерактивом и вызов не имеет ничего общего с входом в систему:
bash -lic true
То, что вход в систему через консоль или графический интерфейс запускает оболочку входа (или, возможно, нет), полностью зависит от процесса входа в систему с использованием соответствующего вызова.
Основной источник путаницы заключается в том, что для оболочки «login» есть еще одно общее значение:
Оболочка входа пользователя - это оболочка, определенная в записи этого пользователя passwd(которая может исходить из /etc/passwdLDAP или другого источника).
loginПрограмма, SSH и т.д. запустить эту оболочку в качестве логина оболочки в смысле означает в остальной части ответа - с ведущим -в имени команды, как правило. Если вы хотите быть особенно запутанным, вы можете сказать:
Некоторые процессы входа в систему запускают оболочку входа пользователя как оболочку входа.
Обратите внимание, что вход в GUI запускает оболочку входа исключительно потому, что разработчики посчитали это удобным - LightDM запускает сценарий входа в систему, который, очевидно, не является интерактивным и, конечно же, не зависит от оболочки входа пользователя (во втором смысле). Не зависите от диспетчера отображения, запускающего оболочку входа, хотя - не все из них, а на Wayland и GNOME процесс входа вообще не использует сценарии оболочки.
Первый процесс, который выполняется под нашим идентификатором пользователя при входе в сеанс. Процесс входа в систему говорит оболочке вести себя как оболочка входа в систему с соглашением: передача аргумента 0, который обычно является именем исполняемого файла оболочки, с добавленным символом «-»
Интерактивная оболочка:
Читает команды из пользовательского ввода на tty. Среди прочего, такая оболочка читает файлы запуска при активации, отображает приглашение и по умолчанию включает управление заданиями. Пользователь может взаимодействовать с оболочкой. Оболочка, выполняющая скрипт, всегда является неинтерактивной оболочкой.
Проще говоря: интерактивная оболочка требует ввода данных пользователем, а неинтерактивная оболочка запускается сценариями и не требует ввода данных пользователем.
@ Даиси нет! GUI не имеет к этому никакого отношения. Речь идет об оболочках командной строки, а не о графических оболочках (которые также существуют, но являются другим зверем).
тердон
1
@ Джордж нет, есть две ошибки: вход в систему через графический интерфейс не запускает оболочку входа (или любую другую соответствующую оболочку) и вход в удаленную систему через telnet запускает оболочку telnet, но через ssh запускает интерактивный вход в систему ракушка.
тердон
1
@ Джордж на самом деле, я исправлен. Некоторые менеджеры входа в систему с графическим интерфейсом могут запустить оболочку входа для чтения .profile(я думал, что они просто исходят .profileвручную, но я могу ошибаться ).
тердон
0
Я хотел бы отметить, что вы можете запустить интерактивную оболочку входа в систему:
выполнение sudo /bin/loginи ввод ваших учетных данных
проведение exec -l /bin/bash
проведение su -
и как ответы выше, используя ssh и войдите на удаленную машину
Кроме того, вы можете проверить (в bash), является ли оболочка входом в систему, набрав, echo $0и если вывод начинается с тире -, то это оболочка входа.
non-interactive login shell
.По сути, является ли оболочка логином или нет, интерактивной или нет, имеет значение только по одной причине:
Файлы инициализации и набор параметров по умолчанию зависят от того, является ли оболочка логином или нет, интерактивной или нет.
Соответственно, является ли оболочка логином или нет, интерактивной или нет, зависит исключительно от используемого вызова - точного имени команды и параметров.
Два свойства являются ортогональными, независимо от того, является ли оболочка логином или нет, не имеет отношения к определению, является ли она интерактивной или нет.
Bash запускает оболочку входа в систему, если любое из них верно:
argv[0]
имя команды, с которой она была вызвана, начинается с-
-l
задана опцияАналогично, bash запускает интерактивную оболочку, если любое из них верно:
bash some/file
) или строка команды для запуска (bash -c 'foo'
) (фактическое условие немного сложнее, см. руководство)-i
была указана опцияПричем (как это ни парадоксально) последнее подразумевает, что
bash -ic 'foo'
запускается интерактивная оболочка.Таким образом, следующее запускает интерактивную оболочку входа в систему, даже если она не имеет ничего общего с интерактивом и вызов не имеет ничего общего с входом в систему:
То, что вход в систему через консоль или графический интерфейс запускает оболочку входа (или, возможно, нет), полностью зависит от процесса входа в систему с использованием соответствующего вызова.
Условия и эффекты подробно описаны в руководстве по bash, раздел «Файлы запуска» .
Основной источник путаницы заключается в том, что для оболочки «login» есть еще одно общее значение:
Оболочка входа пользователя - это оболочка, определенная в записи этого пользователя
passwd
(которая может исходить из/etc/passwd
LDAP или другого источника).login
Программа, SSH и т.д. запустить эту оболочку в качестве логина оболочки в смысле означает в остальной части ответа - с ведущим-
в имени команды, как правило. Если вы хотите быть особенно запутанным, вы можете сказать:Некоторые процессы входа в систему запускают оболочку входа пользователя как оболочку входа.
Обратите внимание, что вход в GUI запускает оболочку входа исключительно потому, что разработчики посчитали это удобным - LightDM запускает сценарий входа в систему, который, очевидно, не является интерактивным и, конечно же, не зависит от оболочки входа пользователя (во втором смысле). Не зависите от диспетчера отображения, запускающего оболочку входа, хотя - не все из них, а на Wayland и GNOME процесс входа вообще не использует сценарии оболочки.
источник
Вход в оболочку:
Интерактивная оболочка:
Проще говоря: интерактивная оболочка требует ввода данных пользователем, а неинтерактивная оболочка запускается сценариями и не требует ввода данных пользователем.
источник
.profile
(я думал, что они просто исходят.profile
вручную, но я могу ошибаться ).Я хотел бы отметить, что вы можете запустить интерактивную оболочку входа в систему:
sudo /bin/login
и ввод ваших учетных данныхexec -l /bin/bash
su -
Кроме того, вы можете проверить (в bash), является ли оболочка входом в систему, набрав,
echo $0
и если вывод начинается с тире-
, то это оболочка входа.источник