Дифференцируйте Интерактивный вход в систему и неинтерактивную оболочку невхода в систему

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

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

Поскольку я понимаю
интерактивный - не входят в оболочку: Запустите систему, войдите в систему и откройте терминал и
неинтерактивная - входят в оболочку: telnet к системе и входит в систему

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

25
задан 15 May 2017 в 21:35

4 ответа

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

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

  • интерактивная оболочка входа в систему: Вы входите в удаленный компьютер через, например 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
38
ответ дан 23 November 2019 в 01:12

Оболочка входа в систему:

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

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

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

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

3
ответ дан 23 November 2019 в 01:12

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

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

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

Эти два свойства являются в других отношениях ортогональными - является ли оболочка входом в систему или не не имеет никакого влияния на определение, является ли это интерактивным или нет.

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, процесс входа в систему не использует сценарии оболочки вообще.

6
ответ дан 23 November 2019 в 01:12

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

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

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

0
ответ дан 23 November 2019 в 01:12

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

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