Если вы открываете оболочку или терминал (или переключаетесь на него), и он просит вас войти в систему (Имя пользователя? Пароль?), Прежде чем выдает подсказку, это оболочка для входа.
Если это не так (например, gnome-терминал ) и позволяет вам использовать его сразу, это оболочка без авторизации.
Если вы обычный пользователь Ubuntu Desktop, единственная оболочка для входа - это ... ваш рабочий стол (вы вводите пароль для входа, верно;)? Ну, технически это оболочка входа в систему, которая запускает графический интерфейс, но это входит в жаргон. И да, он будет читать настройки в.profile
Единственный раз , когда вы (обычный пользователь), вероятно , увидит оболочку входа в системе, которая выглядит как шелл, если у вас возникли какие - то проблемы с рабочим столом , и вы переключитесь на виртуальный терминал с Ctrl+ Alt+ F1ярлыком.
Другие общие случаи использования оболочки входа в систему:
удаленный доступ к вашему компьютеру через ssh(или локальное соединение с ssh localhost)
моделирование начальной оболочки входа с помощью bash -l(или sh -l)
Если я запускаю свою Eclipse IDE из терминала, она открывается, как и ожидалось, но если я пытаюсь открыть ее, щелкая значок Eclipse, она не может распознать местоположение Java (если в файле .profile не установлено PATH для Java). Это означает, что для щелчка по значку Eclipse требуется оболочка входа, почему?
Герцог
2
@DUKE, Нет, это означает, что переменные окружения должны быть установлены по- разному, когда вы используете рабочий стол / GUI, а не настоящую консольную систему только для командной строки. Поместите свой PATH и т. Д. В ~/.pam_environment(только переменные, никаких команд bash!), Выйдите из системы, войдите в систему и наблюдайте, как все волшебным образом появляется на рабочем столе и в gnome-терминале!
иш
1
Вход через ssh не вызывает оболочку входа. Это не загружается /etc/profile, /etc/profile.dили ~/.profile.
@xuhdev Вход через ssh вызывает оболочку входа и загружает / etc / profile, /etc/profile.d и ~ / .bash_profile.
MichaelZ
9
Я не думаю, что правильный ответ можно дать без «технического жаргона». Так как этот вопрос является первым, который появляется в Google по запросу «что такое оболочка входа в систему», я даю более правильный ответ ниже:
Оболочка входа - это просто оболочка, которая называется оболочкой входа. Это не означает, что оболочка появляется после входа в систему, хотя обычно приложение, которое регистрирует вас, сообщает, что запускается как оболочка входа. Существуют следующие способы сказать оболочке, что она должна быть логиновой:
Запуск оболочки с аргументом -lили --loginаргументом в предположении, что он это знает (я не знаю оболочек, которые не знают -l, но --loginподдерживаются только несколькими оболочками).
Запуск оболочки с argv[0]установленным на -{some_string}(то есть с HYPHEN-MINUS, добавленным к обычному argv[0]или к какой-либо другой строке). Это то, что делают ssh и su: su просто запускает исполняемый файл с -suas argv[0](привет всем, кто думает argv[0], что имеет какое-то отношение к исполняемому в настоящее время имени исполняемого файла), ssh запускает zsh, -zshкогда пользователь установил в /bin/zshкачестве своей оболочки.
Логичность оболочки не имеет абсолютно никакого отношения к тому, кто спрашивает у вас пароль или выполняет какую-либо другую процедуру аутентификации. Некоторые программы, такие как ssh или login (или некоторые терминальные эмуляторы, такие как urxvt), запускают оболочки как логин, используя argv[0]которые начинаются с HYPHEN-MINUS. Некоторые, такие как su или sudo (или zsh: смотрите -модификатор precommand, описанный в разделе PRECOMMAND MODIFIERS in man zshmisc), не делают этого по умолчанию, но это можно сказать. У некоторых есть единственная возможность указать shell, чтобы он входил в систему, используя свой аргумент (то есть bash -l): ssh с аргументом команды (который явно указывает ssh, что запускать на удаленном конце).
Обычно лучше сначала обратиться к документации программы, используемой для вызова оболочки, чтобы определить, будет ли оболочка входом в систему, а затем выполнить несколько тестов, чтобы определить, будет ли приложение запускать оболочку входа (например, путем добавления echoв .profile).
Меня интересует второй вариант: как я могу изменить argv [0] до (или после) вызова bash? Это можно сделать из командной строки?
VeryHardCoder
@VeryHardCoder Это зависит от приложения, которое вы используете для запуска команды. В коде C это делается путем непосредственного предоставления argv[0]одному из exec*функций, естественных и неизбежных: вы всегда поставляете какargv[0] и путь командовать фактически выполняемый при использовании exec*функции, даже если вы никогда не хотите , argv[0]чтобы отличаться от команды запуска. Другие языки предоставляют свои собственные способы. В частности, bash позволяет использовать exec -a new_argv0 bash, но это, конечно, заменит текущую оболочку на то, что вы execредактировали, поэтому вам может понадобиться использовать subshell ( (exec -a -zsh zsh))
ZyX
Хорошо понял! На самом деле, это можно сделать даже более простым способом: (exec -l bash) ...
VeryHardCoder
1
Какая функциональная разница между ними? Это просто логический флаг?
Алексей
@Alexey Основное функциональное отличие - это набор файлов конфигурации, используемых при запуске. $0и, может быть, что-то еще (переменная, настройка и т. д.) установлено так, что логичность оболочки может быть обнаружена в файле конфигурации, но кто на самом деле беспокоится, обнаружив это, так что это будет иметь какое-то значение? Это все, что я знаю.
~/.pam_environment
(только переменные, никаких команд bash!), Выйдите из системы, войдите в систему и наблюдайте, как все волшебным образом появляется на рабочем столе и в gnome-терминале!/etc/profile
,/etc/profile.d
или~/.profile
.Я не думаю, что правильный ответ можно дать без «технического жаргона». Так как этот вопрос является первым, который появляется в Google по запросу «что такое оболочка входа в систему», я даю более правильный ответ ниже:
Оболочка входа - это просто оболочка, которая называется оболочкой входа. Это не означает, что оболочка появляется после входа в систему, хотя обычно приложение, которое регистрирует вас, сообщает, что запускается как оболочка входа. Существуют следующие способы сказать оболочке, что она должна быть логиновой:
-l
или--login
аргументом в предположении, что он это знает (я не знаю оболочек, которые не знают-l
, но--login
поддерживаются только несколькими оболочками).argv[0]
установленным на-{some_string}
(то есть с HYPHEN-MINUS, добавленным к обычномуargv[0]
или к какой-либо другой строке). Это то, что делают ssh и su: su просто запускает исполняемый файл с-su
asargv[0]
(привет всем, кто думаетargv[0]
, что имеет какое-то отношение к исполняемому в настоящее время имени исполняемого файла), ssh запускает zsh,-zsh
когда пользователь установил в/bin/zsh
качестве своей оболочки.Логичность оболочки не имеет абсолютно никакого отношения к тому, кто спрашивает у вас пароль или выполняет какую-либо другую процедуру аутентификации. Некоторые программы, такие как ssh или login (или некоторые терминальные эмуляторы, такие как urxvt), запускают оболочки как логин, используя
argv[0]
которые начинаются с HYPHEN-MINUS. Некоторые, такие как su или sudo (или zsh: смотрите-
модификатор precommand, описанный в разделе PRECOMMAND MODIFIERS inman zshmisc
), не делают этого по умолчанию, но это можно сказать. У некоторых есть единственная возможность указать shell, чтобы он входил в систему, используя свой аргумент (то естьbash -l
): ssh с аргументом команды (который явно указывает ssh, что запускать на удаленном конце).Обычно лучше сначала обратиться к документации программы, используемой для вызова оболочки, чтобы определить, будет ли оболочка входом в систему, а затем выполнить несколько тестов, чтобы определить, будет ли приложение запускать оболочку входа (например, путем добавления
echo
в.profile
).источник
argv[0]
одному изexec*
функций, естественных и неизбежных: вы всегда поставляете какargv[0]
и путь командовать фактически выполняемый при использованииexec*
функции, даже если вы никогда не хотите ,argv[0]
чтобы отличаться от команды запуска. Другие языки предоставляют свои собственные способы. В частности, bash позволяет использоватьexec -a new_argv0 bash
, но это, конечно, заменит текущую оболочку на то, что выexec
редактировали, поэтому вам может понадобиться использовать subshell ((exec -a -zsh zsh)
)$0
и, может быть, что-то еще (переменная, настройка и т. д.) установлено так, что логичность оболочки может быть обнаружена в файле конфигурации, но кто на самом деле беспокоится, обнаружив это, так что это будет иметь какое-то значение? Это все, что я знаю.