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 
  • Передать переменную оболочки как / pattern / to awk
  • находить файлы без расширения
  • Изменить регистр n-й буквы в строке
  • Как добавить псевдоним для моего pwd в существующий файл?
  • Просмотр истории bash отдельного активного TTY
  • Почему корневая оболочка по умолчанию настроена по-другому с обычной оболочкой обычного обычного пользователя?
  • Создать фальшивую оболочку в Linux?
  • Почему / etc / shadow сокращает пароль, который я установил с помощью команды: useradd -p?
  • Оболочка сценария скрипта условно
  • bash: /home/user/.ssh/authorized_keys: нет такого файла или каталога
  • Как печатать ip с iftop, отсортированным по использованию полосы пропускания
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.