Диференціюйте інтерактивний вхід і неінтерактивну оболонку без входу


25

Я намагаюся розмежувати ці чотири терміни вхід, не вхід, інтерактив та неінтерактив .

  • інтерактивна - оболонка для входу
  • інтерактивна - оболонка без входу
  • неінтерактивна - оболонка для входу
  • неінтерактивна - оболонка без входу

Як я розумію,
інтерактивна оболонка без входу . Запустіть систему, увійдіть у систему та відкрийте термінал та
неінтерактивну оболонку входу : telnet до системи та увійдіть

А як щодо інтерактивної оболонки для входу?
Чи входить вона в систему, відкривається віртуальний термінал і входить? і
неінтерактивна - оболонка без входу, чи працює вона автоматизованим сценарієм у crontab?

Відповіді:


38

Єдине справжнє помилкове уявлення, яке ви, мабуть, має про те, що являє собою неінтерактивну оболонку входу.

Коротко (детальніше див. Тут ) із прикладами:

  • інтерактивна оболонка для входу: Ви входите, наприклад, у віддалений комп'ютер ssh. Крім того, ви переходите до Tty на локальній машині ( Ctrl+ Alt+ F1) і входите там.

  • інтерактивна оболонка без входу: відкрийте новий термінал.

  • неінтерактивна оболонка без входу. Запустіть сценарій. Усі сценарії виконуються у власній підзахисті, і ця оболонка не є інтерактивною. Він відкривається лише для виконання сценарію і закривається негайно, коли сценарій буде закінчений.

  • неінтерактивна оболонка входу: це вкрай рідко, і ви навряд чи зможете зіткнутися з нею. Один із способів запуску - це echo command | ssh server. Коли sshзапускається без команди (тож sshзамість ssh commandякої буде працювати commandна віддаленій оболонці), вона запускає оболонку входу. Якщо значення stdinof 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

Я хочу зрозуміти, що 1) Для мене вхід у gui означає запустити систему, увійти в систему та відкрити термінал 2) робити telnet або ssh - це інтерактивна оболонка для входу, значить, приклад, який я дав, non-interactive login shellє неправильним.
ромашка

@daisy дякую за роз’яснення; відповідь відредагована.
тердон

гаразд, а гуй не має значення, інтерактивна оболонка без входу: просто відкрийте новий термінал локально чи віддалено через telnet або ssh
Дейзі

@daisy так, звучить справа. Але , будь ласка , прочитайте Муру в відповідь ретельно , як добре , так що пояснює , що, по суті, це питання семантики і впливає тільки на те , що завантажувальні файли зчитуються оболонкою. Також дивіться тут для ще більш повного огляду різних типів оболонок.
тердон

Неінтерактивні оболонки для входу не такі рідкісні, наприклад, git використовує їх, IIRC.
квазгар

6

По суті, незалежно від того, незалежно від того, чи є оболонка входом, інтерактивним чи ні, має значення саме з однієї причини:

Файли ініціалізації та встановлені параметри за замовчуванням залежать від того, входить оболонка для входу чи ні та інтерактивна чи ні.

Відповідно, чи оболонка є логіном чи ні, чи інтерактивною чи ні, залежить виключно від використовуваного виклику - точної назви команди та параметрів.

Ці два властивості є ортогональними - незалежно від того, вхід оболонки чи ні, не має значення для визначення того, чи є вона інтерактивною чи ні.

Bash запускає оболонку входу, якщо будь-яке з них відповідає дійсності:

  • argv[0], назва команди, на яку було викликано, починається з а -
  • -lзадана опція

Аналогічно, bash запускає інтерактивну оболонку, якщо будь-яке з них відповідає дійсності:

  • не було вказано файл для виконання (тобто команда не була bash some/file) або командна рядок для запуску ( bash -c 'foo') (фактична умова трохи складніша, див. посібник)
  • -iбула вказана опція

Помітно (і, як це не парадоксально), остання означає, що bash -ic 'foo'запускається інтерактивна оболонка.

Отже, нижче запускається інтерактивна оболонка для входу, навіть якщо вона не має нічого інтерактивного щодо цього, і виклик не має нічого спільного з входом у систему:

bash -lic true

Те, що вхід через консоль або GUI запускає оболонку входу (а може і ні), цілком є ​​наслідком процесу входу за допомогою відповідного виклику.

Умови та ефекти докладно описані в посібнику з bash, розділі про файли запуску .


Основним джерелом плутанини є те, що для оболонки "login" є ще одне загальне значення:

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

loginПрограма, SSH і т.д. запустити цю оболонку в якості логіна оболонки в сенсі означає в решті частини відповіді - з провідним -в імені команди, як правило. Якщо ви хочете бути особливо заплутаними, можете сказати:

Деякі процеси входу запускають оболонку входу користувача як оболонку входу.

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


3

Оболонка для входу:

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

Інтерактивна оболонка:

Читає команди з вводу користувача на tty. Крім усього іншого, така оболонка зчитує файли запуску під час активації, відображає підказку та дозволяє керувати роботою за замовчуванням. Користувач може взаємодіяти з оболонкою. Оболонка із запуском сценарію - це завжди неінтерактивна оболонка.

Простіше кажучи: інтерактивна оболонка вимагає введення користувача, тоді як неінтерактивна оболонка управляється сценаріями і не потребує введення користувача.


Тож приклади, які наводяться правильними.
ромашка

Так, ромашка ваша в потрібному місці.
Джордж Удосен

1
@daisy ні! GUI абсолютно нічого спільного з цим не має. Йдеться про оболонки командного рядка, а не графічні оболонки (які також існують, але є іншим звіром).
тердон

1
@George ні, є дві помилки: вхід через GUI не запускає оболонку входу (або будь-який інший тип відповідних оболонок) і вхід у віддалену систему через telnet запускає оболонку telnet, але через ssh запускає інтерактивний вхід оболонки.
тердон

1
@ Джордж насправді, я виправлений. Деякі менеджери входу в графічний інтерфейс можуть запустити оболонку входу для читання .profile(я думав, що вони просто джерело .profileвручну, але я можу помилитися ).
тердон

0

Хочу зазначити, що ви можете запустити інтерактивну оболонку входу, виконавши:

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

Крім того, ви можете перевірити (в bash), чи ввійшов він в оболонку, ввівши echo $0і якщо вихід починається з тире -, то це оболонка для входу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.