ログインシェル - ログインシェルを呼び出す方法

ログインシェル - ログインシェルを呼び出す方法

私はログインシェルが何であるか、ログインシェルと非ログインシェルの違いを知っています。

しかし、私を混乱させるのはそれがどのように呼ばれるかです。-パラメータ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シェルに渡すにはどうすればよいですか?

答え1

SSHなどのプログラムは、次のコマンドを使用してシェルを起動sudoします。suexecシステムコールシリーズ。これらのシステムコールにより、呼び出しプログラムは関数を含むすべてのパラメータを指定できます。たとえば、次のように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

最初の呼び出しでわかるように、渡された引数の配列はexecve0bashなので、["-bash"]引数0も同じです-bash

答え2

これは複製が簡単で、次の方法で呼び出し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では、doneのようにlogin(1)コードは次のように実行します。

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

プロセス名にハイフンを挿入します。これはソースコードを実行またはlogin確認することで確認できます。bashstracelogin

答え3

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

関連情報