web-dev-qa-db-ja.com

ログインシェルはどこで定義されていますか?

Sudo -i/-shere の違いを読んでいた。コマンドshoptを使用した後、all(Sudo su/Sudo -i/Sudo -s$Shellは同じ結果を提供しますが、shoptコマンドの結果は異なります。

それでは、ログインシェルと非ログインシェルはどのように定義されていますか?

どこからshoptが結果を取得しますか?

なぜ$Shellに関連しないのですか?

Sudo su

givinv@87-109:~$ Sudo su
root@87-109:/home/givinv# 
root@87-109:/home/givinv# 
root@87-109:/home/givinv# shopt -q login_Shell && echo 'Login Shell' || echo 'No login Shell'
No login Shell
root@87-109:/home/givinv# echo $Shell
/bin/bash
root@87-109:/home/givinv# 
root@87-109:/home/givinv# exit
givinv@87-109:~$ 

Sudo -i

givinv@87-109:~$ Sudo -i
root@87-109:~# 
root@87-109:~# shopt -q login_Shell && echo 'Login Shell' || echo 'No login Shell'
Login Shell
root@87-109:~# echo $Shell
/bin/bash
root@87-109:~# 

Sudo -s

root@87-109:~# Sudo -s
root@87-109:~# shopt -q login_Shell && echo 'Login Shell' || echo 'No login Shell'
No login Shell
root@87-109:~# echo $Shell
/bin/bash
root@87-109:~# 
16
prado

TL; DR

  • ログインシェルはどこで定義されていますか? /etc/passwd
  • Sudo su/Sudo su -/Sudo -i/Sudo -sは同じですか?いいえ、それらはすべてシェルを生成しますが、異なる方法および異なるコンテキストで生成されます。
  • $Shellは何をしますか? /etc/passwdと同様に、デフォルトのシェルを指定してください。

実際の回答

まず、shoptはbash固有であることに言及することが重要です。たとえば、私はmkshシェルユーザーであり、shoptにはないkshとは異なり、shoptもありません。

次に、login_Shellが正確に表すものは何ですか? man bashから:

login_Shell

ログインシェルとして起動された場合、シェルはこのオプションを設定します

それが重要なポイントです。 Sudo -iは、あなたが読んだ以前の回答から既に知っているように、最初のログインをシミュレートすることになっています。そのため、このオプションについてmkshlogin_Shell onを報告します。これは、Sudo -iが、ログインプロセス中にのみ表示されるはずのファイル(対話型シェルからは取得されない)をシェルに強制的に移動させるかのように考えてください。

他の場合では、すでにシェルのインスタンスを実行しているため、そもそもログインシェルにすることはできず、オプションの目的は異なります。 Sudo -sは、単に$Shell/etc/passwdで設定されたデフォルトのシェルを表すことを意図しています)変数を読み取り、root権限で実行します。これは、Sudo $ShellまたはSudo mkshまたはSudo bash(使用した方)を実行するのと同じです。

私はbashユーザーだと言ったことを覚えていますか?これを見てください:

$ bash --posix
bash-4.3$ Sudo -s
[Sudo] password for xieerqi: 

DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id 
uid=0(root) gid=0(root) groups=0(root)

DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU

表示されるのは、Sudo -smkshからbash Shellにジャンプし、設定した特性プロンプトが表示されていることです。そしてもちろん、これはログインアクションではないので、lに対しては、シェルが非ログインシェルインスタンスとして生成されたことを報告します。ただし、私の場合、$-にはechoという文字がありません。これはログインシェルインスタンスの場合に表示されます。

最後に、Sudo suSudo su -にも同じ考え方が当てはまります。後でログインシェルインスタンスが生成され(つまり、ログインに必要な特定のファイルが実行されます)、前者は対話型シェルのみが生成されます(つまり、ログインファイルは実行されません)。

bash-4.3$ Sudo su
[Sudo] password for xieerqi: 
root@eagle:/home/xieerqi# shopt login_Shell
login_Shell     off
root@eagle:/home/xieerqi# exit
bash-4.3$ Sudo su -
[Sudo] password for xieerqi: 
$ shopt login_Shell
login_Shell     on

技術的には、shopt login_Shell$Shellとは一切関係ありません。このように考えてください:その目的は、howbashの実行を示すことです。 $Shellは、/etc/passwdで割り当てたもののみを反映することになっています。

ログインシェルと非ログインシェルの違いについては、unix.stackexchange.comの尊敬されるジルが this answer で説明しています。


追加の楽しみ

あなたが試すことができる何か楽しいものがあります。既にご存知かもしれませんが、ログインシェルは.profile(およびUbuntuの.bashrcそうするように構成されている から.profileを実行しますが、非ログインhellは実行します.bashrcファイルのみを実行します。したがって、echoを使用して、これらのコマンドのうちログインシェルを実行するものと実行しないものをテストすることができます。

$ echo "echo 'hi,i am .profile'"  >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ Sudo -i
hi, i am .bashrc
hi,i am .profile
$ Sudo su
hi, i am .bashrc
root@eagle:~# Sudo su -
hi, i am .bashrc
hi,i am .profile
$ Sudo -s
hi, i am .bashrc
root@eagle:~# 

適切なことに、2行の出力がある場合は、login_Shellonに設定されます。

17

@Sergが説明しているように、 このシェルで実行中のシェルを確認する方法についてShell変数は現在のユーザーのdefaultShell /etc/passwdから読み取った場合:

$ grep zanna /etc/passwd
zanna:x:1000:1000:Zanna,,,:/home/zanna:/bin/bash

echo $Shellの場合、常に/bin/bashを返します:

$ zsh
% echo $Shell
/bin/bash

シェルがログインシェルであるかどうかは、shelloptシェルの起動時に決定されるイオン。シェルプログラムは、この情報を他のすべての設定と変数とともに保存します。 shoptコマンドは、この情報を表示し、可能であれば問題のオプションについて設定または設定解除する方法を提供します(もちろん、これはlogin_Shellには当てはまりません。シェルの起動に使用されるプロセス)

Sudoプログラムのオプションは、これらのさまざまなタイプのルートシェルの起動方法を決定します。

enter image description here

11
Zanna

man bash

ログインシェルは、引数ゼロの最初の文字が-であるシェル、または--loginオプションで開始されたシェルです。

man login

$HOME$Shell [...]の値は、パスワードエントリの適切なフィールドに従って設定されます。

要するに:

  • ログインシェルとして起動された場合、シェルはログインシェルです。
  • 環境変数$Shellは、loginまたは呼び出しプログラムによって設定されます(例:su)。シェル自体は設定しません。
  • shoptは、現在有効なシェルオプションを示します。
3
AlexP