非対話型および非ログインのシェルを理解しようとしていますが、非対話型および非ログインのシェルの起動プロセスを概念化するのに問題があります。
私が理解する方法は、スクリプトやプロセスが始まるときです。つまり、メモリ領域が作成され、子プロセスが分岐を介して親プロセスの冗長環境をコピーします。これが私には理解になります。
非対話型の非ログインプロセスまたはスクリプト用にシェル環境が定義されているときの混乱は何ですか?インタラクティブシェルの起動方法を考えると、少しパニックになります。
対話型シェルを理解する方法は次のとおりです。
- ユーザーはログインIDをLinuxカーネルに渡します。
- Linuxカーネルは/ etc / passwordファイルでユーザーを見つけ、割り当てられたシェルを識別します。
- シェルが起動しました
- シェルはログインスクリプトを読み取り、ユーザーのシェル環境を定義します。
- Linux は、シェルがコマンドを受け入れる準備ができたことを示すコマンドプロンプトを生成します。
非対話型シェルと非ログインシェルの手順は似ていますか?これが私が考える方法です。
- そのプロセスは親プロセスによって分岐されます。
- Linux は、プロセスが実行されるユーザー ID を識別します。
- Linux は /etc/password ファイルでユーザー ID を探します。
- シェルが起動しました
- BASH_ENV読み取り(定義されている場合)
- プロセスはシェルと対話してAPIにコマンドを渡します。
なんだか何か抜けたようにぎこちないようです。私が正しい道を行っているかどうか誰かに教えてもらえますか?
答え1
実際にファイルについて考える必要はありませんpasswd
。シェルは通常、パスワード認証を処理しません。これは思ったより簡単かもしれません。init
などの他のプログラムは、あなたの質問に記載されているほとんどのログインプロセスをgetty
実際に実行します。login
ほとんどのシェルはセッションを次のように扱います。インタラクティブシェルこのオプションを使用してシェルを-i
起動するか、標準出力が端末デバイス(たとえば/dev/tty01
)に接続されている場合。
シェルはセッションを次のように扱います。ログインシェルパラメーター0($ 0)の最初の文字がダッシュ(-
)の場合。一部のシェルは-l
同じ効果を生成するオプションもサポートしています。
「ログインシェル」は通常、伝統的な方法で始まります。Linuxログインプロセス:
このinit
プログラムまたは他のプログラムは、getty
ログインに使用できる各端末でプロセスを開始します。
プログラムgetty
はプロンプトを印刷し、username
端末から読み取ります。次に、ユーザー名を引数としてプログラムを呼び出しますgetty
。login
このlogin
プログラムはファイル内のユーザー名を見つけpasswd
、ユーザーのパスワードを読み、確認し、ユーザーのユーザーとグループIDと環境変数を設定し、その他のログイン関連タスクを実行します。今後ログインシェルを起動します。
プロセスは、(シェル内とも呼ばれる)プログラム名の前にダッシュ()を追加して、ログインシェルであることをlogin
シェルに通知します。-
argv[0]
$0
ログインおよびインタラクティブセッションの概念の詳細については、使用している特定のシェルのマニュアルgetty
ページを参照してくださいlogin
。さまざまなシェル(たとえば、sh
などksh
)は、少し異なる方法でbash
起動コマンドファイル(たとえば.profile
、など)を読み込みます。.bash_rc