Чи є неінтерактивні оболонки для входу?


14

Я знаю, в чому різниця між інтерактивними / неінтерактивними оболонками для входу / не входу, але, схоже, на практиці ніколи не буде інтерактивної оболонки для входу, якщо у вас є щось на зразок /bin/bash --login some-script.shсценарію (і навіть це здається трохи дивно). Це правильно чи вони більш поширені?


7
telnet towel.blinkenlights.nlдля неінтерактивної оболонки для входу ;-)
Martin Tournoij

1
На це запитання в цій довшій відповіді коротко .
Wildcard

@CaptainMan: Дивлячись на відповіді, у нас є дві, орієнтовані на зовсім різні значення "інтерактивного". Зважаючи на це, чи можете ви трохи розширити свою відповідь, щоб пояснити, яке значення ви використовували, коли задавали питання?
cjs

Відповіді:


10

Я припускаю, що ви говорите про концепцію входу Баша проти не входу в систему та інтерактивних проти неінтерактивних оболонок Bash, як описано в розділі " Виклик " на сторінці сторінки. (Це відрізняється від інтерпретації відповіді Джеймса Янгмена про будь-яку довільну команду, що використовується як "оболонка" (або інтерпретатор команд користувача) у passwd(5)файлі, і приймає чи ні ця програма введення користувача; деякі, наприклад /usr/sbin/nologin, очевидно, ні. )

Ви маєте рацію, що /bin/bash --login some-script.shстворить неінтерактивне виклик Bash, і це, мабуть, патологічний приклад. Існує один випадок, можливо , рідко , але на самому ділі не дивно, що виробляє неінтерактивному оболонку входу в систему : ssh somehost < some-file. Тут sshdпочнеться Bash з argv[0]set до, -bashтому що йому не дано команду запустити, змусивши Bash вважати себе оболонкою входу, але, оскільки stdin не підключений до терміналу, Bash не встановить себе в інтерактивний режим ( $-не міститиме i) .

(Особисто цей ssh somehost somecommandвигляд здається набагато більш розумним, ніж зворотне, яке не вважається "оболонкою входу", навіть якщо це свіжий логін, somehostяк і вище).

Нещодавно я зробив те, що мав би зробити давно, і склав таблицю режимів Bash і які файли init запускаються . Якщо ви вважаєте це заплутаним, подумайте про це, принаймні, і я. Мене містифікує, якою була їх первісна мета з правилами, коли .bashrcвиконується.


1

Більшість оболонок для входу за рахунком за нещодавно встановленою системою насправді:

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

Очевидно , /bin/bashі /bin/shтрадиційні снаряди , і вони інтерактивні. Але всі інші елементи цього списку не інтерактивні. Якщо ви читаєте список і не знаєте, що робить один з них, ви можете просто переглянути його сторінку керівництва (наприклад, man nologinабо man sync).

Що команда насправді виконує

Дивлячись на історію публікацій капітана, я бачу, що з Unix вони досить недосвідчені. Тож, можливо, питання в коментарі про не наступне стосується командного рядка вгорі відповіді, а не просто виводу. Тож я поясню і командний рядок, навіть якщо це питання справді поза темою.

Команда - це конвеєр Unix . Трубопровід - це ланцюг команд - ви читаєте його зліва направо - в якому вихід першої команди стає входом другої, вихід другої стає входом третьої тощо, до тих пір, поки кінець трубопроводу. Вихід останнього процесу відображається на терміналі (якщо він не був перенаправлений). Додаткову інформацію див. У Вікіпедії на оболонках трубопроводів .

Якщо ви не розумієте, що робить трубопровід, ви можете просто запустити його в сегменти, щоб побачити, що відбувається. Ви також можете прочитати сторінку керівництва для команд, які використовуються (тут awk, sortі uniq). Насправді, ви повинні це зробити зараз. Я почекаю.

Давайте почнемо поетапно виконувати етапи трубопроводу (це можна сміливо робити у власній системі Unix):

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

Вихідний результат - це просто вміст сьомого поля з /etc/passwdфайлу. Це база даних (плоский текстовий файл), яка повідомляє системі, що таке оболонка для входу у кожного. Якщо ви хочете дізнатись більше про це, /etc/passwdпросто прочитайте його (це читається у всьому світі) та подивіться на сторінку керівництва (man 5 passwd).

Ознайомившись із цілим списком, ви можете зрозуміти, що таке популярні товари, але це не гарний формат для відповіді на це запитання, адже питання справді стосувалося поширеності неінтерактивних оболонок. Давайте порахуємо їх. Найпростіший спосіб зробити це - спочатку сортувати елементи:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

Ми можемо використовувати програму, uniqщоб показати нам лише унікальні елементи:

~ $ awk -F: '{print $ 7}' </ etc / passwd | сортувати | uniq | sed -e 's / ^ / /' / bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin

Але зачекайте, це не корисно, скільки кожного там було? Давайте запитаємо uniq(прочитайте сторінку чоловіка!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

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

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

Зачекайте, що це не може бути правильним, 17 приходить до 1 і 5 після 23. Проблема полягає в тому, що елементи сортуються лексикографічно . Давайте попросимо sortїх сортувати за чисельністю та у зворотному порядку:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

Я думаю, що це пояснює все в оригінальній відповіді. Якщо вам все ще незрозуміло, що стосується цих команд, ви можете прочитати сторінки керівництва. Якщо ви все ще не зрозуміли принципи того, що відбувається, може бути краще почати з того, щоб прочитати книгу (в Інтернеті чи на папері), що пояснює Unix та Linux.


Ви можете пояснити трохи більше, будь ласка? Я не впевнений, що слідкую за тим, що читаю.
Капітан Людина

це /bin/syncоболонка? так що будь-яка утиліта є оболонкою?
eloone

@eloone є два (можливо три) значення для "оболонки". Одне - це програми, налаштовані як оболонка для входу в базу даних паролів. Це значення слова, призначеного фразою "неінтерактивна оболонка для входу". Інше значення - "REPL", що підходить для щоденної інтерактивної роботи в системі Unix ". Ці інтерактивні. Однак більшість програм, які можна використовувати в контексті REPL, також підтримують неінтерактивне використання в якості інтерпретаторів для якоїсь мови сценаріїв (хоча "скрипт оболонки" майже універсально означає "скрипт Bourne-family-shell").
Джеймс Янгмен

2
Ви ніби відповідаєте на інше запитання. Ви просто перераховуєте наявні оболонки та вказуєте, що деякі ніколи не будуть інтерактивними. Я вважаю, що ОП запитує, чи не зустрічається неінтерактивна оболонка для входу в дикій природі. Тож чи оболонки, які можуть бути інтерактивними, наприклад, колись запускають неінтерактивні оболонки для входу . Іншими словами, "оболонка входу" тут не означає "оболонку входу користувача за замовчуванням", це означає оболонку, запущену як оболонку входу . Дивіться unix.stackexchange.com/a/46856/22222
terdon

1
Або, мабуть, враховуючи, що афіша прямо пише bash --loginу запитанні, він запитує конкретно про bashпроцеси, які не мають iнабору параметрів. (Вони виникають з таких команд, як ssh somehost < script.sh: це буде "неінтерактивна" оболонка для входу в сенси, визначені в розділі ІНВОЦІАЦІЯ на сторінці "Bash".)
cjs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.