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 正規表現 (regexp と rlike) の検索機能の例分析

この記事では、例を使用して MySQL 正規表現 (regexp および rlike) の検索機能を...

yumコマンドの使い方

1. yumの紹介Yum (フルネームは Yellow dogUpdater、Modified) は...

webpackでCSSを分割・圧縮し、リンクでインポートする手順

まずコードファイルの構造を見てみましょう。エントリファイル (index1.js) の内容: ...

Linux での vi (vim) の新しい使い方のまとめ

私は数年間 vi エディタを使ってきましたが、実用的な用途で使ったことはありませんでした。今日 Py...

MySQLコマンドが中国語で入力できない問題の解決方法

問題を見つける最近、MySQL コマンドを使用して MySQL サーバーに接続したときに、以下のよう...

MySQL データベース接続例外の概要 (収集する価値あり)

Centos にプロジェクトをデプロイするときに奇妙な問題が見つかりました。データベース接続で例外...

TypeScript で時間を費やした場所の概要

TS で時間を過ごした場所をいくつか記録します。 (まず、文句を言わせてください。stackover...

MySQL ディープページング問題の解決の実践記録

目次序文ディープページングを制限すると遅くなるのはなぜですか?サブクエリによる最適化B+ツリー構造の...

HTML 内の CSS および JS リンクのバージョン番号 (キャッシュを更新)

背景検索エンジンで「.htaccess キャッシュ」というキーワードを検索すると、ウェブサイトのファ...

MySQLデータベースインデックスの欠点と適切な使用

目次インデックスの適切な使用1. 通常のインデックスのデメリット2. 主キーインデックスの落とし穴3...

CentOS 7にChromeブラウザをインストールする方法

この記事では、CentOS 7 に Chrome ブラウザをインストールする方法を紹介します。詳細は...

よく使われる Docker コマンドと例の概要と分析

目次1. コンテナライフサイクル管理(1)ドッカー実行(2)スタート/ストップ/リスタート(3)ドッ...

ウェブデザインの初心者に役立つ学習教材をいくつかお勧めします

勉強中に読んだ本についてもよく聞かれます。以下は初心者におすすめの本です(私が勉強中に読んだ本です。...

Vue における属性とプロパティの具体的な使用法と違い

目次Vue.jsにおける属性とプロパティ値および関連する処理として属性とプロパティの概念属性とプロパ...

HTMLフレームワーク_Powernode Javaアカデミー

1. フレームワークブラウザのドキュメント ウィンドウには 1 つの Web ページ ファイルしか表...