非対話型ログインシェルを理解する方法は?

非対話型ログインシェルを理解する方法は?

非対話型の非ログシェルは理解しやすいです。単にターミナルでシェルスクリプトを実行すると、シェルスクリプトを実行する非対話型の非ログインシェルが起動します。

しかし、非対話型ログインシェルがどのように機能するのかわかりません。シェルが非対話型の場合、シェルの実行中にログイン資格情報を入力できないため、ログイン資格情報をシェルスクリプトなどに入力しますか?

答え1

私はUNIXシステムの内部を初めて探索し始めたときに混乱したことを覚えています。これは非常に簡単な説明です。最新のシステムを理解するには、このようなStackExchangeの回答に合わせるには広すぎる背景知識が必要です。

ログイン資格情報は、という特権プロセスによって要求loginされますls -l /bin/login。 (もちろん、ソースも利用可能です。)詳細についてはをご覧くださいman login

まず第一に、このプロセスは複数のライブラリ呼び出し(PAMライブラリを介して参照を参照man 7 pam)を使用して資格情報を確認し、時間制限がないか、ホームディレクトリが存在するかを確認します。すべての条件が満たされたら、権限を放棄し、必要なシェルのコピーを開始します。通常(しかし排他的ではない)、これは最後のフィールドとして定義されます/etc/passwd

次のコマンドを使用すると、自分のパスワードエントリを表示できます(奇妙なことに、パスワードの暗号化されたコピーも含まれない場合があります)getent

getent passwd "$USER"
roaima:x:1001:1001:Roaima:/home/roaima:/bin/bash

このファイル構造の詳細についてはを参照してくださいman 5 passwd

シェルに対する厳格で迅速な要件はありません/bin/bash。独自のアカウント権限でのみ実行されるため、完全にカスタマイズできます。

これは、シェル自体がユーザーの資格情報について何も知らないことを説明したいと思います。インタラクティブモードで実行されたときに読み込まれる一般的なプログラム(おそらく複雑なプログラム)です。標準入力そしてに手紙を書く標準出力。非対話モードでは、同じプログラムを使用してファイル、パイプ、またはソケットを読み書きできます。

原則として、入力から1行を読み、単語をスペースで分割し、サブプロセスを分岐してプログラムをexecvpe()呼び出して実行する独自のシェルを作成できます。 (実際には、引用した文字列を分割しないこと、上位( )で直接演算すること、シグナルなど克服すべき追加の障害物が多いですchdir。)cd

関連情報