web-dev-qa-db-ja.com

bashはどのように呼び出されているかをどのように知るのですか?

_Ubuntu 12.04_にjailkitをインストールし、ユーザーのシェルを_/bin/bash_に設定しましたが、呼び出されると、_/etc/bash.bashrc_ではなく_/etc/profile_が実行されます。

これまでにjailkitを使用したことがない場合は、その要点を以下に示します。

  1. システムルートの「jailed」バージョンは、/ home/jailなどのどこかに作成されます。
  2. 投獄されたユーザーのホームディレクトリは、/ home/jail/home/testuserのようにそのフォルダ内に移動されます
  3. 関連する構成ファイルは/ home/jail/etc /にコピーされます-制限された/ etc/passwdを含みます
  4. アクセスを許可するプログラムは、/ bin/bashなどの対応するディレクトリにコピーされます
  5. 投獄されたユーザーがログインすると、/ etc/jail /にchrootされ、それより上のファイルは表示されません。

したがって、_/etc/passwd_に次のようなエントリを持つtestuserがあります。

_testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh
_

ファイル_/home/jail/etc/passwd_には、次のようなエントリがあります。

_testuser:1001:1003::/home/testuser:/bin/bash
_

bash(1)を読んだので、問題は、bashがログインシェルとして呼び出されていないと見なしていることだと思います。

Bashが対話型ログインシェルとして、または--loginオプションを指定した非対話型シェルとして呼び出されると、最初にファイル/ etc/profile(ファイルが存在する場合)からコマンドを読み取って実行します。

bashが実際に_/usr/sbin/jk_chrootsh_によって呼び出されているようですが、bashがシェルのタイプと、実行する必要のあるスタートアップファイルのセットをどのように決定しているかわかりません。 。

これをトラブルシューティングできるかどうかを確認したいのですが、わかりません。

Bashはどのように呼び出されているかをどのように知るのですか?

ps:運が悪かったのでlogin(1)も調べました。

7
cwd

通常、bashは、ログインプログラムがそれを呼び出すと、その名前が-bashであることをbashに通知するため、それがログインシェルであることを認識します。その名前は、0番目のコマンドライン引数であるargv[0]にあります。これは、通常、ユーザーがプログラムを呼び出す方法です。最初のハイフンは、ログインシェルであることをシェルに伝えるための規則です。オプション--loginまたは-lを渡すと、Bashはログインシェルとしても動作します。詳細については、 ログインシェルと非ログインシェルの違いは? を参照してください。

Jailkit 2.16以降、jk_chrootshは、さまざまなソースから呼び出すシェルへの絶対パスを読み取り、このパスをargv[0]として渡し、独自のコマンドライン引数をそのシェルに渡します。 jk_chrootsh自体が/etc/passwdで使用される通常のユースケースでは、-lなどの引数を渡す方法はありません。絶対パスは-で始まらないため、小さな中間プログラムを使用する以外に、jk_chrootshにログインシェルを呼び出させる方法はありません。

#include <unistd.h>
int main () {
    execl("/bin/bash", "-bash", NULL);
    return 127;
}

jk_chrootshがログインシェルを呼び出す簡単な方法を持っていることを期待していました。機能をリクエストすることをお勧めします。

loginは、argv[0]で始まる-を使用してユーザーのログインコマンド/シェルを呼び出します。シェルはargv[0]をチェックして、ログインシェルとして呼び出されているかどうかを判断します。

@slmが言うように、それはbashマニュアルの「呼び出し」セクションで明確に指定されています。

さらに、cshtcshkshzshyashbashなどのいくつかのシェル、およびAlmquist Shellの一部のバリアントは、loginを有効にする-lオプションをサポートしています。最初の引数。これはloginでは使用されませんが、任意のargv[0]でコマンドを実行するのが難しいもの(ほとんどのシェルなど)からログインシェルをシミュレートする場合に使用できます。グラフィカルログインマネージャーで使用されているのを見てきました。

6

bashのmanページ を見てください。彼らは、そこで呼び出す方法の違いについて話し合っています。このセクションは[〜#〜]呼び出し[〜#〜]と呼ばれます。呼び出される主な2つの方法は、ログインシェル(bash -l)およびインタラクティブシェルとして(bash -i)。

この他のUnixとLinuxのQ&Aを見てください: ログインシェルと非ログインシェルの違いは? 。それはあなたが求めていることをほぼ正確にカバーしています。

2
slm