Существуют ли неинтерактивные оболочки для входа?

14

Я знаю, в чем разница между интерактивными / неинтерактивными и не входящими в систему оболочками, но на практике кажется, что не будет неинтерактивной оболочки для входа в систему, если у вас нет чего-то похожего /bin/bash --login some-script.shна сценарий (и даже это кажется немного странно). Это правильно или они более распространены?

Капитан человек
источник
7
telnet towel.blinkenlights.nlдля неинтерактивной оболочки входа в систему ;-)
Martin Tournoij
1
На этот вопрос дан краткий ответ в рамках этого более длинного ответа .
Wildcard
@CaptainMan: Глядя на ответы, у нас есть два, которые сосредоточены на совершенно разных значениях «интерактивный». В свете этого вы можете немного расширить свой ответ, чтобы объяснить, какое значение вы использовали, когда задавали вопрос?
Курт Дж. Сэмпсон

Ответы:

10

Я предполагаю, что вы говорите о концепции Bash «вход в систему» ​​и «не вход в систему» ​​и «интерактивные» и «неинтерактивные оболочки Bash», как описано в разделе « Вызов » на странице руководства. (Это отличается от интерпретации в ответе Джеймса Янгмана любой произвольной команды, используемой в качестве «оболочки» (или интерпретатора пользовательских команд) в passwd(5)файле, и от того, принимает ли эта программа пользовательский ввод, а некоторые, например /usr/sbin/nologin, явно не принимают . )

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

(Лично этот случай кажется гораздо более разумным, чем обратное, ssh somehost somecommandкоторое не считается «оболочкой входа в систему», даже если это новый вход в систему, somehostкак и выше).

Недавно я сделал то, что должен был сделать давно, и составил таблицу режимов Bash и запускаемых файлов инициализации . Если вы считаете, что это сбивает с толку, позаботьтесь об этом. Это мистифицирует меня, какова была их первоначальная цель с правилами о том, когда .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 есть два (может быть, три) значения слова "shell". Один из них - программы, настроенные в качестве оболочки для входа в базу паролей. Это значение слова, подразумеваемого фразой «неинтерактивная оболочка входа». Другое значение - «REPL, подходящий для повседневной интерактивной работы в системе Unix». Это интерактивные. Однако большинство программ, используемых в контексте REPL, также поддерживают неинтерактивное использование в качестве интерпретаторов для какого-либо языка сценариев (хотя «сценарий оболочки» почти всегда означает «сценарий оболочки семейства Борна»).
Джеймс Янгман
2
Вы, кажется, отвечаете на другой вопрос. Вы просто перечисляете доступные оболочки и указываете, что некоторые никогда не будут интерактивными. Я полагаю, что ОП спрашивает, встречалась ли когда-либо неинтерактивная оболочка входа в дикую природу. Итак, могут ли оболочки, которые могут быть интерактивными, например, bash, запускать неинтерактивные оболочки входа в систему . Другими словами, «оболочка входа» здесь не означает «оболочку входа пользователя по умолчанию», это означает оболочку, которая была запущена как оболочка входа . См. Unix.stackexchange.com/a/46856/22222
terdon
1
Или, возможно, учитывая, что автор прямо пишет bash --loginв вопросе, он спрашивает конкретно о bashпроцессах, которые не имеют установленной iопции. (Они возникают из-за таких команд, как ssh somehost < script.sh; это будет оболочка «неинтерактивная» для входа в систему, в смысле, указанном в разделе « ПРИВЕДЕНИЕ» справочной страницы Bash.)
Курт Дж. Сэмпсон,