Различать Интерактивный вход в систему и неинтерактивную оболочку без входа в систему

25

Я пытаюсь разграничить эти четыре условия: вход в систему, не вход в систему, интерактивный и неинтерактивный :

  • интерактивный - оболочка входа
  • интерактивная оболочка без авторизации
  • неинтерактивный - оболочка входа
  • неинтерактивный - оболочка без входа в систему

Как я понимаю,
интерактивная оболочка без входа в систему : запустите систему, войдите в систему и откройте терминал, а
неинтерактивная - войдите в систему : войдите в систему и войдите в систему.

Но как насчет интерактивной оболочки?
Вход в систему, открытие виртуального терминала и вход в систему? и
неинтерактивный - оболочка без входа в систему, запускается ли автоматический сценарий в crontab?

маргаритка
источник

Ответы:

38

Единственное реальное заблуждение, которое у вас, по-видимому, заключается в том, что представляет собой неинтерактивную оболочку входа в систему.

Кратко (см. Здесь для более подробной информации), с примерами:

  • интерактивная оболочка для входа в систему: вы, например, входите в удаленный компьютер 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 localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on
terdon
источник
Я хочу пояснить, что: 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

То, что вход в систему через консоль или графический интерфейс запускает оболочку входа (или, возможно, нет), полностью зависит от процесса входа в систему с использованием соответствующего вызова.

Условия и эффекты подробно описаны в руководстве по bash, раздел «Файлы запуска» .


Основной источник путаницы заключается в том, что для оболочки «login» есть еще одно общее значение:

Оболочка входа пользователя - это оболочка, определенная в записи этого пользователя passwd(которая может исходить из /etc/passwdLDAP или другого источника).

loginПрограмма, SSH и т.д. запустить эту оболочку в качестве логина оболочки в смысле означает в остальной части ответа - с ведущим -в имени команды, как правило. Если вы хотите быть особенно запутанным, вы можете сказать:

Некоторые процессы входа в систему запускают оболочку входа пользователя как оболочку входа.

Обратите внимание, что вход в GUI запускает оболочку входа исключительно потому, что разработчики посчитали это удобным - LightDM запускает сценарий входа в систему, который, очевидно, не является интерактивным и, конечно же, не зависит от оболочки входа пользователя (во втором смысле). Не зависите от диспетчера отображения, запускающего оболочку входа, хотя - не все из них, а на Wayland и GNOME процесс входа вообще не использует сценарии оболочки.

Мур
источник
3

Вход в оболочку:

Первый процесс, который выполняется под нашим идентификатором пользователя при входе в сеанс. Процесс входа в систему говорит оболочке вести себя как оболочка входа в систему с соглашением: передача аргумента 0, который обычно является именем исполняемого файла оболочки, с добавленным символом «-»

Интерактивная оболочка:

Читает команды из пользовательского ввода на tty. Среди прочего, такая оболочка читает файлы запуска при активации, отображает приглашение и по умолчанию включает управление заданиями. Пользователь может взаимодействовать с оболочкой. Оболочка, выполняющая скрипт, всегда является неинтерактивной оболочкой.

Проще говоря: интерактивная оболочка требует ввода данных пользователем, а неинтерактивная оболочка запускается сценариями и не требует ввода данных пользователем.

Джордж Удосен
источник
Так что примеры, которые приведены правильно.
маргаритка
Да ромашка твоя в нужном месте.
Джордж Удосен
1
@ Даиси нет! GUI не имеет к этому никакого отношения. Речь идет об оболочках командной строки, а не о графических оболочках (которые также существуют, но являются другим зверем).
тердон
1
@ Джордж нет, есть две ошибки: вход в систему через графический интерфейс не запускает оболочку входа (или любую другую соответствующую оболочку) и вход в удаленную систему через telnet запускает оболочку telnet, но через ssh запускает интерактивный вход в систему ракушка.
тердон
1
@ Джордж на самом деле, я исправлен. Некоторые менеджеры входа в систему с графическим интерфейсом могут запустить оболочку входа для чтения .profile(я думал, что они просто исходят .profileвручную, но я могу ошибаться ).
тердон
0

Я хотел бы отметить, что вы можете запустить интерактивную оболочку входа в систему:

  1. выполнение sudo /bin/loginи ввод ваших учетных данных
  2. проведение exec -l /bin/bash
  3. проведение su -
  4. и как ответы выше, используя ssh и войдите на удаленную машину

Кроме того, вы можете проверить (в bash), является ли оболочка входом в систему, набрав, echo $0и если вывод начинается с тире -, то это оболочка входа.

SantaXL
источник