Различие между входом в систему Shell и невходом в систему Shell?

Перейдите к http://kmuto.jp/debian/hcl и вставьте вывод lspci -n как спросили. Вы получите рекомендации драйвера.

Можно также просто проверить, работает ли каждый драйвер на Вас - ничто не взорвется из-за него :)

335
08.05.2012, 23:57
7 ответов

Оболочка входа в систему является первым процессом, который выполняется под Вашим идентификатором пользователя, когда Вы входите в систему для интерактивной сессии. Процесс входа в систему говорит оболочке вести себя как оболочка входа в систему с конвенцией: передающий аргумент 0, который обычно является названием исполняемого файла оболочки с a - символ предварительно ожидается (например. -bash тогда как это обычно было бы bash. Оболочки входа в систему обычно читают файл, который делает вещи как установка переменных среды: /etc/profile и ~/.profile для традиционной Оболочки Bourne, ~/.bash_profile дополнительно для удара , /etc/zprofile и ~/.zprofile для zsh , /etc/csh.login и ~/.login для csh, и т.д.

Когда Вы входите в систему на текстовой консоли, или через SSH, или с su -, Вы получаете интерактивную оболочку входа в систему. Когда Вы входите в систему в графическом режиме (на X менеджерах по оформлению), Вы не получаете оболочку входа в систему, вместо этого Вы получаете менеджер сеансов или менеджер окон.

Редко выполнить неинтерактивную оболочку входа в систему, но приблизительно X настроек делают это, когда Вы входите в систему с менеджером по оформлению, чтобы расположить считать файлы профиля. Другие настройки (это зависит от распределения и от менеджера по оформлению), чтение /etc/profile и ~/.profile явно, или не читайте их. Другой способ получить неинтерактивную оболочку входа в систему состоит в том, чтобы войти в систему удаленно с командой, прошел через стандартный вход, который не является терминалом, например. ssh example.com <my-script-which-is-stored-locally (в противоположность ssh example.com my-script-which-is-on-the-remote-machine, который выполняет неинтерактивную, оболочку невхода в систему).

При запуске оболочки в терминале на существующей сессии (экран, X терминалов, буфер терминала Emacs, оболочка в другом, и т.д.), Вы получаете интерактивную, оболочку невхода в систему. Та оболочка могла бы считать конфигурационный файл оболочки (~/.bashrc для удара, вызванного как bash, /etc/zshrc и ~/.zshrc для zsh, /etc/csh.cshrc и ~/.cshrc для csh, файл, обозначенный ENV переменная для оболочек POSIX/XSI-compliant, таких как тире, ksh, и удар при вызове как sh, $ENV если установлено и ~/.mkshrc для mksh, и т.д.).

Когда оболочка запускает скрипт, или команда передала свою командную строку, это - неинтерактивная, оболочка невхода в систему. Такие оболочки выполняются все время: очень распространено, что, когда программа называет другую программу, она действительно запускает крошечный скрипт в оболочке для вызова той другой программы. Некоторые оболочки читают файл запуска в этом случае (удар петляет обозначенный BASH_ENV переменная, zsh выполнения /etc/zshenv и ~/.zshenv), но это опасно: оболочка может быть вызвана во всех видах контекстов, и существует едва что-либо, что можно сделать, который не мог бы повредить что-то.

Я упрощаю немного, вижу руководство для окровавленных деталей.

325
27.01.2020, 19:26
  • 1
    Могли Вы давать пример, как работать bash как неинтерактивная оболочка входа в систему? –  Piotr Dobrogost 16.06.2013, 11:47
  • 2
    @PiotrDobrogost echo $- | bash -lx –  Gilles 'SO- stop being evil' 16.06.2013, 15:11
  • 3
    , который я не знаю, верно ли это в целом, но я хочу отметить, что, когда я открываю новый терминал (на osx, использующем настройки по умолчанию), я получаю оболочку входа в систему даже при том, что я никогда не ввожу в своем имени пользователя или пароле. –  Kevin Wheeler 29.08.2015, 01:55
  • 4
    @KevinWheeler На OSX, по умолчанию, Терминальное приложение выполняет оболочку входа в систему. (Как я объясняю, программа, которая запускает оболочку, решает, действует ли оболочка как оболочка входа в систему.) Это не нормальный способ сделать вещи. –  Gilles 'SO- stop being evil' 29.08.2015, 02:01
  • 5
    @IAmJulianAcosta Если FOO переменная среды (т.е. .profile содержит export FOO=something) затем это доступно всем подпроцессам, включая foo.sh. Если Вы изменяетесь .profile кому: export FOO=something_else затем ./foo.sh все еще распечатает something до следующего раза Вы входите в систему. –  Gilles 'SO- stop being evil' 06.10.2016, 18:13

В оболочке входа в систему, argv[0][0] == '-'. Это - то, как это знает, что это - оболочка входа в систему.

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

23
27.01.2020, 19:26
  • 1
    Согласно man bash, с добавленным акцентом, "Оболочка входа в систему является той, чей первый символ нуля аргумента - или один, запустился с - опция входа в систему". –  Wildcard 23.01.2017, 13:49

В оболочке входа в систему, argv[0][0] == '-'. Это - то, как это знает, что это - оболочка входа в систему.

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

23
27.01.2020, 19:26

Оболочка, запущенная в новом терминале в GUI, была бы интерактивной оболочкой невхода в систему. Это получило бы Ваш .bashrc, но не Ваш .profile, например.

18
27.01.2020, 19:26

Чтобы определить, находитесь ли вы в оболочке входа в систему:

prompt> echo $0
-bash # "-" is the first character. Therefore, this is a login shell.

prompt> echo $0
bash # "-" is NOT the first character. This is NOT a login shell.

В Bash вы также можете использовать shopt login_shell :

prompt> shopt login_shell
login_shell     off

(или на в оболочке входа в систему).

Информацию можно найти в man bash (поиск по Invocation). Вот отрывок:

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

Вы можете проверить это сами. Каждый раз, когда вы используете SSH, вы используете оболочку входа в систему. Например:

prompt> ssh user@localhost
user@localhost's password:
prompt> echo $0
-bash

Важность использования оболочки входа в систему заключается в том, что будут выполнены любые настройки в /home/user/.bash_profile .Вот еще немного информации, если вам интересно (из man bash )

«Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с - -login сначала читает и выполняет команды из файла / etc / profile, если этот файл существует. После чтения этого файла он ищет ~ / .bash_profile , ~ / .bash_login и ~ / .profile в указанном порядке, а также считывает и выполняет команды из первого существующего и доступен для чтения. Параметр --noprofile может использоваться при запуске оболочки, чтобы запретить такое поведение. "

52
27.01.2020, 19:26

Я подробно расскажу об отличном ответе Жиля в сочетании с методом Тимоти для проверки типа оболочки входа в систему.

Если вы хотите увидеть все своими глазами, попробуйте приведенные ниже фрагменты и сценарии.

Проверка того, является ли оболочка (не -)интерактивной

if tty -s; then echo 'This is interactive shell.'; else echo 'This is non-interactive shell.'; fi

Проверка того, является ли оболочка (не -)логином

Если вывод echo $0начинается с -, это пример вывода:-bash)оболочки входа в систему(echo $0. В противном случае это не -оболочка входа в систему(echo $0пример вывода:bash).

if echo $0 | grep -e ^\- 2>&1>/dev/null; then echo "This is login shell."; else echo "This is non-login shell."; fi;

Давайте объединим два вышеуказанных вместе, чтобы получить обе части информации одновременно:

THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; 
THIS_SHELL_LOGIN_TYPE='non-login'; 
if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; 
if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

Сценарии:

Типичный сеанс SSH без специальных параметров

ssh ubuntu@34.247.105.87
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

ubuntu@ip-172-31-0-70:~$ THIS_SHELL_INTERACTIVE_TYPE='non-interactive';
ubuntu@ip-172-31-0-70:~$ THIS_SHELL_LOGIN_TYPE='non-login';
ubuntu@ip-172-31-0-70:~$ if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi;
ubuntu@ip-172-31-0-70:~$ if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
ubuntu@ip-172-31-0-70:~$ echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

interactive/login

Запуск скрипта или явное выполнение через новую оболочку

ubuntu@ip-172-31-0-70:~$  bash -c 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; 
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

Удаленный запуск локального сценария

ssh ubuntu@34.247.105.87 < checkmy.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

non-interactive/login

Удаленный запуск команды через ssh

ssh ubuntu@34.247.105.87 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

non-interactive/non-login

Удаленный запуск команды по ssh с помощью переключателя -t

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

ssh ubuntu@34.247.105.87 -t 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

Примечание :На тему, почему удаленный запуск команды не работает login shellподробнее здесь .

16
27.01.2020, 19:26

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

Когда я использовал VSCode для удаленной разработки на виртуальной машине Linux, я понял, что мои переменные среды в /etc/profile.d/env_file.shне подхватывались интегрированным терминалом VSCode даже после перезапуска VSCode и самого терминала. Вывод для $0показал, что это не оболочка входа в систему.

Похоже, что после подключения к удаленному Linux-компьютеру VSCode просто запускал одну основную оболочку входа в систему, но для каждого интегрированного терминала он запускал просто другой /bin/bashпроцесс. Вы видите, что в выводе psнет -, но это не помогло решить, является ли текущая оболочка логином или нет.

$ echo $0
/bin/bash
$ ps  $(echo $$)
  PID TTY      STAT   TIME COMMAND
 2274 pts/3    Ss     0:00 /bin/bash

Когда я захожу на сервер напрямую через SSH, я вижу -bash, это оболочка входа.

~$ echo $0
-bash
~$ ps  $(echo $$)
  PID TTY      STAT   TIME COMMAND
 2088 pts/2    Ss     0:00 -bash

Затем я добавил параметр аргумента оболочки(-l)в VSCode. Теперь вывод для эха $0такой же, но обратите внимание на идентификатор$$(текущего процесса, PID)/bin/bashс опцией -l(--login).

$ echo $0
/bin/bash
$ ps  $(echo $$)
   PID TTY      STAT   TIME COMMAND
  2309 pts/3    Ss     0:00 /bin/bash -l

Таким образом, чтобы проверить, является ли оболочка оболочкой входа в систему, вам нужно проверить как echo $0, так и ps $(echo $$). В зависимости от реализации вывод должен быть либо -bash, либо /bin/bash -l

.
2
04.05.2020, 12:44

Теги

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