login shell (bash) – как мы вызываем оболочку входа

Я знаю, что такое оболочка для входа и разница между оболочкой входа и оболочкой без входа.

Но меня озадачивает то, как он вызывается. Говорят, что оболочка входа вызывается с аргументом - как аргумент 0.

Как передать аргумент в вызываемую оболочку, тогда аргумент 0 является именем самой оболочки?

 # -bash -bash: -bash: command not found 

Хорошо, ничего страшного

 # bash --login # echo $0 # bash 

Я до сих пор не вижу -bash .

Только когда я вхожу в SSH, тогда я могу видеть -bash при выпуске echo $0 . Но вернемся к моему первоначальному вопросу,

  1. как Unix / Linux создает оболочку входа?
  2. Что такое «вещь», которая создает оболочку входа во время процесса входа? Если это процесс входа в систему, вызывающий оболочку bash во время входа в систему, как она передает аргумент 0 как - в оболочку bash?

3 Solutions collect form web for “login shell (bash) – как мы вызываем оболочку входа”

Такие программы, как SSH, sudo , su и т. Д., Запускают оболочку с помощью семейства системных вызовов exec . И эти системные вызовы позволяют вызывающей программе указывать каждый аргумент, включая функцию. Например, используя sudo для запуска оболочки входа:

 $ strace -fe execve -o sudo.log sudo -i root:~ $ echo $0 -bash root:~ $ logout $ grep bash sudo.log 19124 execve("/bin/bash", ["-bash"], [/* 31 vars */]) = 0 19140 execve("/bin/ls", ["ls", "/etc/bash_completion.d"], [/* 40 vars */]) = 0 

Как видно из первого вызова execve , массив аргументов, переданных в bash является просто ["-bash"] поэтому аргумент zero равен -bash .

Это легко реплицировать с помощью zsh , что позволяет назначить соответствующий аргумент вызову exec(3) через ARGV0 :

 % ARGV0=-bash bash -bash-4.1$ ps o cmd --pid=$$ CMD -bash -bash-4.1$ exit % ARGV0=imnotaduck bash $ ps o cmd --pid=$$ CMD imnotaduck $ exit % 

В C, как это сделано с помощью login(1) , код будет запускать что-то по строкам:

 execlp("/usr/local/bin/bash", "-bash", ..., (char *) 0) 

для вставки дефиса в имя процесса. Это может быть подтверждено либо запуском login либо bash в режиме strace , либо путем проверки исходного кода для login .

Чтобы войти в систему как пользователь usertest, выполните (root):

 root:~# login usertest Password: usertest:~$ echo $0 -bash usertest:~$ exit root:~# _ 

Это формальный способ входа пользователя в систему.

Конечно, вы всегда можете выполнить команду, для которой он равен $ 0:

 bash -c 'echo "hello"; echo $0;' mylogthisshell 

Который может иметь все начальную тире

 bash -c 'echo "hello"; echo $0;' -mylogthisshell 
  • как это сделать: dd if = coolstuff.iso of = (ssh kev @ mypi)
  • Как передать команду программе в оболочку?
  • Как мы можем переименовать файл с точкой с запятой в качестве части имени файла?
  • Запуск в корневой оболочке из скрипта пользователя bash
  • Почему не работал Ctrl-C?
  • Как безопасно отключить сетевой ресурс на Linux STB без сбоев (я получаю GSOD)?
  • Разрешение отклонено при получении файла md5sum с помощью сценария оболочки?
  • Проблема с булевыми тестами && и || в bash
  • Escape filepath
  • Сценарий оболочки ionCube дает ошибку
  • Что не так с `if ($ num1 -eq 0) || ($ num2 -eq 0) `в сценарии оболочки bash?
  • Interesting Posts

    Тестирование любого из семейства связанных значений в переменной Bash

    текст для поиска и замены во всех файлах и во всех каталогах

    Сообщение Gnome 3 не работает после переключения с XFCE 4

    Программное обеспечение RAID 10 + LVM на смешанных дисках, выравнивание сектора?

    Получение Интернета в Linux VM без обнаружения в сети

    Сделать udisks2 очистить устаревшие точки монтирования?

    Ошибка входа в Windows Remote Desktop с Ubuntu Server 12.4

    Как systemd обрабатывает смерть ребенка управляемого процесса?

    некоторые кириллические имена файлов были повреждены при переходе с сервера на сервер

    Linux подмножество «iw reg set DE» и разрешенные по разрешению каналы Wi-Fi

    Как я могу использовать mutt execute command tag-pattern, а затем delete-pattern через shell?

    Возвращает количество совпадений с помощью find / replace с помощью sed

    Какая польза от опции -f для `touch`?

    Как сделать окна приложений всегда на вершине в Linux mint?

    Различия между обложками хромовой ОС?

    Linux и Unix - лучшая ОС в мире.