bashの初期化メカニズムの詳細な説明

bashの初期化メカニズムの詳細な説明

Bash 初期化ファイル

対話型ログインシェル

次の場合にはログイン シェルを取得できます。

  • ローカル端末またはネットワーク経由の ssh を介してシステムにログインしたときに取得する最上位シェル。この場合に取得されるログイン シェルは対話型シェルです。
  • 対話型ログイン シェルを取得するには、ターミナルで --login オプションを指定して bash を起動します。
  • スクリプト内で --login オプションを指定して bash を呼び出すと (例: #!/bin/bash --login)、非対話型のログイン シェルが生成されます。
  • su - を使用して指定されたユーザーに切り替えると、そのユーザーのログイン シェルが取得されます。 - がない場合、非ログインシェルになります。

ログイン シェルが起動すると、まずシステムのグローバル構成 /etc/profile を読み取り、次に 3 つの構成ファイル ~/.bash_profile、~/.bash_login、~/.profile を順番に検索し、最初に見つかった読み取り可能なファイルを読み取ります。

ログイン シェルが終了すると、~/.bash_logout 内のコマンドを読み取って実行します。 設定ファイルが存在するが読み取り不可能な場合は、エラー メッセージが表示されます。ファイルが存在しない場合は、bash は自動的に次のファイルを検索します。

デフォルトでは、PATH、USER、MAIL、HOSTNAME、HISTSIZE などのグローバル環境変数は、/etc/profile ファイルで定義されます。/etc/bash.bashrc ファイル (システム レベルのシェル関数とエイリアスを含む) と、特定のプログラムを初期化するために使用される /etc/profile.d パス内のすべての *.sh ファイルも自動的にインポートされます。

対話型非ログインシェル

非ログイン シェルとは、システムの起動時にシステムに対して認証する必要がないことを意味します。 GUI でユーザーが開いたターミナルは、デフォルトでは非ログイン シェルであり、logout コマンドで判別できます。

# Ubuntu GUIデスクトップでターミナルを開く > ログアウト
bash: ログアウト: ログインしないシェル: `exit' を使用する
> bash --ログイン
> logout # 通常通りログアウトすると何も出力されません

非ログインシェルは初期化時に ~/.bashrc リソースファイルのみを読み取り、~/.bashrc ファイルは ~/.bash_profile または ~/.profile によって自動的にロードされます。そのため、ログインシェルと対話型非ログインシェルが同じ構成になるように、環境変数は通常 ~/.bashrc ファイルで定義されます。

> echo "export sflag=\"ログインシェルはこのメッセージを表示します\"" >> ~/.profile  
> バッシュ 
> $sflagをエコーする 
          # 変数が見つからない場合は、空白行が出力されます> exit 
> bash --ログイン 
> $sflagをエコーする 
ログインシェルはこのメッセージを見るでしょう 
> ログアウト

非対話型シェル

スクリプトが bash コマンドを通じて実行されると、シェルは非対話形式で起動され、実行中にユーザーがスクリプトに干渉することがなくなります。非対話型スクリプトが開始されると、BASH_ENV 変数によって指定されたファイルのみがロードされます。ただし、PATH 変数はデフォルトでは非対話型シェルによってロードされないため、変数 BASH_ENV の値は絶対パスにする必要があることに注意してください。

現在のシェル モードは、特殊変数 - を通じて確認できます。

> エコー$-
himBHs # 'i' は対話型シェルです

もう 1 つの簡単な方法は、プロンプト環境変数 PS1 が現在のシェルに存在するかどうかを確認することです。

if [ -z "$PS1" ]; then echo "非対話型";else echo "対話型";fi

特別な事情

互換モード

sh コマンドを使用して bash を呼び出すと、互換性を確保するために bash は sh と同じ方法で初期化されます。ログイン シェルとして起動されると、bash は /etc/profile と ~/.profile 構成ファイルをその順序で読み取ります。非ログイン シェルとして起動すると、bash は ENV 環境変数によって指定されたファイルのみを読み取ります。

POSIX モード

bash を起動する場合:

  1. set -o posixか、 export POSIXLY_CORRECT=1
  2. bash --posix

Bash は POSIX 標準に従って初期化を試み、環境変数 ENV によって指定されたファイルのみを読み取ります。

リモート起動スクリプト

rshd を使用してスクリプトをリモートで起動する場合、~/.bashrc ファイルのみがロードされます。ただし、rlogin、telnet、rsh、rcp などのリモート コマンドは暗号化されていないプレーン テキスト情報を送信するため、使用しないようにしてください。リモート アクセスが必要な場合は、SSH を使用してください。

UIDとEUIDが一致しません

プロセスが作成されると、プロセスの実行に必要な情報が task_struct に記録されます。 UID (実ユーザー ID) はプロセスを作成したユーザーの ID を記録するために使用され、EUID (実効ユーザー ID) はファイルに対する現在のプロセスのアクセス レベルを決定するために使用されます。一般的に、UID = EUID です。実行可能ファイルの set-user-ID: SUID ビットが有効な場合 (例: -rwsr-xr-x、ユーザーの x が s に置き換えられます)、ファイルが実行されるときに、プロセスには実行者ではなくファイル所有者の権限が付与されます (EUID の値はファイル所有者の ID です)。

bash 実行ファイルに set-user-id フラグを設定すると、デフォルトの所有者は root になるため、他の非 root ユーザーが bash を実行すると、プロセスの UID は EUID と等しくなくなります。この場合、セキュリティを確保するために、bash は初期化フェーズ中にファイルを読み込みません。

制限されたシェル

rbash または bash --restricted または bash -r 経由で起動すると、次のように機能が制限されたシェルが生成されます。

  • cdコマンドは使用できません。また、コマンドに/を含めることはできません。
  • SHELL、PATH、ENV、BASH_ENV環境変数は変更できません
  • ソースコマンドパラメータには、/ を含むファイルを含めることはできません。
  • パスのエイリアスに使用するコマンドのパラメータには / を含めることはできません
  • ファイル内の関数は初期化中にインポートされず、SHELLOPTS は無視されます。
  • リダイレクトは使用できません
  • execコマンドを使用できません
  • enable -f/-d を使用してコマンドを追加または削除することはできません
  • コマンド -p を使用して、コマンドの実行に必要なパスを指定することはできません。
  • 制限モードを自動的にオフにすることはできません

理論的には、この機能により、ユーザーは指定されたフォルダ内の指定されたファイルを実行して、制限された機能を完了できます。ただし、環境変数が適切に設定されていない場合、ユーザーは簡単に制限を解除できます。

> rbash
> cd /etc
rbash: cd: 制限あり
> バッシュ
> cd /etc # bash 環境であり制限がないため、これを正常に実行できます。

効果的なアプローチは、新しく作成されたユーザーが実行できるコマンドを制限することです。たとえば、ftp コマンドのみを実行できる ruser を作成できます。

> useradd -s /bin/rbash ruser # ユーザーがログインするときに提供されるシェルを設定します
> chown -R root:ruser /home/ruse​​r/.bashrc /home/ruse​​r/.bash_profile
# 所有者として root を設定し、グループ所有者として ruser グループを設定します (新しい ruser はデフォルトで ruser グループとして入力されます)
>chmod 640 /home/ruse​​r/.bashrc /home/ruse​​r/.bash_profile
# root は読み取りと書き込みが可能、ruser グループのユーザーは読み取りのみ可能、他のユーザーは何もできません> mkdir /home/ruse​​r/bin # ユーザー実行ファイルまたはリンクを保存します> echo "export PATH=/home/ruse​​r/bin" >> /home/ruse​​r/.bash_profile
> ln -s /user/bin/ftp /home/ruse​​r/bin/ftp

bash の初期化メカニズムの詳細な説明については、これで終わりです。より関連性の高い bash 初期化コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • bash のスクリプトデバッグメカニズムの詳細な説明
  • Linux bash: ./xxx: バイナリ ファイルを実行できません エラー
  • bash を使って日付をカウントダウンする方法
  • Bashスクリプトを使用すると、シェルにログインするたびにLinuxシステム情報を表示できます。
  • 解決策 - BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 権限が不十分です
  • Python3でLinux Bashコマンドを実行する方法
  • bash スクリプトで ssh/scp コマンドにパスワードを渡す方法の詳細な説明
  • Bash スクリプトでの配列メソッドの作成と使用の概要
  • bashコマンドの使い方の詳細な説明

<<:  vue構成ファイルはルーティングとメニューインスタンスコードを自動的に生成します

>>:  MySQLデータベースはMMM高可用性クラスタアーキテクチャを実装します

推薦する

インスタンス化されたオブジェクトパラメータによるMySQLクエリ例の説明

この記事では、オブジェクト パラメータをインスタンス化して MySQL でデータをクエリする方法を紹...

シンプルなカルーセル チャートを実装するための JavaScript の最も完全なコード分析 (ES5)

この記事では、シンプルなカルーセル効果を実現するためのJavaScriptの具体的なコードを参考まで...

Vue ページをリフレッシュするために provide と injection を適用する

目次方法1: 関数を直接呼び出す方法2: provide / inject (静的更新) を使用する...

JavaScript を使用せずに HTML の a タグを無効にするには、純粋な CSS を使用します。

実際、この問題は、HTML の select タグを初めて学んだときにすでに発生していました。今日に...

MySQLで置換関数を実装するためのいくつかの実用的なシナリオ

REPLACE構文REPLACE(String,from_str,to_str)つまり、String...

HTML タグのセマンティクス化 (H5 を含む)

導入HTML は、Web ドキュメントのコンテンツのコンテキスト構造と意味を提供します。HTML 自...

NginxはGzipアルゴリズムを使用してメッセージを圧縮します

HTTP圧縮とは場合によっては、比較的大きなメッセージ データがクライアントとサーバー間で送信され、...

40 CSS/JSスタイルと機能的な技術処理

1-ドロップダウン選択ボックスのスタイル設定 - ドロップダウン リストを変更します。 2- <...

Dockerでspringcloudプロジェクトをデプロイする方法

目次Dockerイメージのダウンロードmysqlとnacosを起動する独自のJavaプロジェクトを変...

ReactアプリケーションにおけるDOM DIFFアルゴリズムの詳細な説明

目次序文VirtualDOM とは何ですか? VirtualDOMを使用する理由DOMレンダリングペ...

HTMLの空リンクの役割についての簡単な説明

空のリンク:つまり、ターゲット エンドポイントとのリンクはありません。フォーマット <a hr...

Ubuntu で G++ を使用して CPP ファイルをコンパイルする

g++ を使用して初めて cpp ファイルをコンパイルしたとき、未定義の参照エラーが報告されました。...

Vueプロジェクトでよく使われる実践的なスキルのまとめ

目次序文1. マルチレベルのデータとイベントの配信には$attrsと$listenersを使用する2...

Echarts 基本入門: 棒グラフと折れ線グラフの一般的な構成

1eChartsの基本手順4つのステップ1 DOMコンテナを見つける2 初期化3 設定オプション4 ...