Я пытаюсь дифференцировать эти четыре условия вход в систему, невход в систему, интерактивный и неинтерактивный:
Поскольку я понимаю
интерактивный - не входят в оболочку: Запустите систему, войдите в систему и откройте терминал и
неинтерактивная - входят в оболочку: telnet к системе и входит в систему
Но что относительно интерактивного - входят в оболочку?
Это входит в систему, открытый виртуальный терминал и входит в систему? и
неинтерактивная - не входят в оболочку, она запускает автоматизированный скрипт в crontab?
Единственное реальное неправильное представление, которое Вы, кажется, имеете, о том, что составляет неинтерактивную, оболочку входа в систему.
Кратко (см. здесь для получения дополнительной информации), с примерами:
интерактивная оболочка входа в систему: Вы входите в удаленный компьютер через, например ssh
. С другой стороны, Вы опускаетесь до tty на своей локальной машине (Ctrl+Alt+F1) и журнал там.
интерактивная оболочка невхода в систему: Откройте новый терминал.
неинтерактивная оболочка невхода в систему: Запустите скрипт. Все скрипты, запущенные в их собственной подоболочке и этой оболочке, не являются интерактивными. Это только открывается для выполнения сценария и сразу закрывается, после того как сценарий закончен.
неинтерактивная оболочка входа в систему: Это чрезвычайно редко, и Вы - unlikey для обнаружения с ним. Один способ запуститься каждый echo command | ssh server
. Когда ssh
запускается без команды (так ssh
вместо ssh command
который будет работать command
на удаленной оболочке), это запускает оболочку входа в систему. Если stdin
из 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
Действительно ли это - оболочка входа в систему?
Нет никакого портативного способа проверить это, но для удара, можно проверить если 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 localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell on
Оболочка входа в систему:
первый процесс, который выполняется под нашим идентификатором пользователя, когда мы входим в систему сессии. Процесс входа в систему говорит оболочке вести себя как оболочка входа в систему с конвенцией: передающий аргумент 0, который обычно является названием исполняемого файла оболочки, с символом “ - ” предварительно ожидал
Интерактивная оболочка:
Чтения управляет от ввода данных пользователем на tty. Среди прочего, такие файлы запуска чтений оболочки на активации, отображает подсказку и включает управление заданиями по умолчанию. Пользователь может взаимодействовать с оболочкой. Оболочка, запускающая скрипт, всегда является неинтерактивной оболочкой.
Просто помещенный: Интерактивная оболочка требует ввода данных пользователем, в то время как неинтерактивная оболочка выполняется сценариями и не требует вводов данных пользователем.
По существу, ли оболочка является входом в систему или нет, интерактивная или не имеет значение точно по одной причине:
Соответственно, ли оболочка является входом в систему или не или интерактивный или не зависит только от используемого вызова - точное название команды и опции.
Эти два свойства являются в других отношениях ортогональными - является ли оболочка входом в систему или не не имеет никакого влияния на определение, является ли это интерактивным или нет.
Bash запускает оболочку входа в систему, если какой-либо из них верен:
argv[0]
, название команды, это было вызвано как, запускается с a -
-l
опция указанаПодобный, удар запускает интерактивную оболочку, если какой-либо из них верен:
bash some/file
) или командная строка для выполнения (bash -c 'foo'
) (фактическое условие немного более сложно, см. руководство),-i
опция была указанаОсобенно (и как это ни парадоксально), последний подразумевает это bash -ic 'foo'
запускает интерактивную оболочку.
Таким образом, следующее запускает вход в систему, интерактивную оболочку, даже при том, что это ничего не имеет безотносительно интерактивный об этом, и вызов не имел никакого отношения к входу в систему:
bash -lic true
Тот вход на пути подключается с консоли, или GUI запускает оболочку входа в систему (или возможно не) полностью эффект процесса входа в систему с помощью соответствующего вызова.
Условия и эффекты описаны подробно в руководстве удара, разделе по Файлам Запуска.
Основной источник беспорядка - то, что существует другое общее значение для оболочки "входа в систему":
Оболочка входа в систему пользователя является оболочкой, определенной в том пользователе passwd
запись (который может прибыть из /etc/passwd
, LDAP или некоторый другой источник).
login
программа, SSH, и т.д. запускает эту оболочку как оболочку входа в систему в смысле, предназначенном в остальной части ответа - с продвижением -
на название команды, обычно. Если бы Вы хотели особенно сбивать с толку, то Вы могли бы сказать:
Некоторые процессы входа в систему запускают оболочку входа в систему пользователя как оболочка входа в систему.
Обратите внимание, что вход в систему GUI запускает оболочку входа в систему просто, потому что разработчики думали это удобный - LightDM запускает скрипт на входе в систему, который, очевидно, не является интерактивным и конечно не зависит от оболочки входа в систему пользователя (во втором смысле). Не зависьте от менеджера по оформлению, начинающего оболочку входа в систему, хотя - не все они делают, и на Уэйленде и GNOME, процесс входа в систему не использует сценарии оболочки вообще.
Я хотел бы упомянуть, которым можно запустить интерактивную оболочку входа в систему:
sudo /bin/login
и ввод в Ваших учетных данныхexec -l /bin/bash
su -
Кроме того, можно проверить (в ударе), если это оболочка является вход в систему путем ввода echo $0
и если вывод запускается с тире -
, затем это - оболочка входа в систему.