web-dev-qa-db-ja.com

ログインシェル(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
Noob

SSH、Sudosuなどのプログラムは、 システムコールの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"]-したがって、引数ゼロは-bash

7
muru

これは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の下でbashstraceを実行するか、loginのソースコードを調べることで確認できます。

1
thrig

ユーザー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
0
user79743