Bashは、それがどのように呼び出されたかをどうやって知ることができますか?

Bashは、それがどのように呼び出されたかをどうやって知ることができますか?

ユーザーシェルをインストールjailkitして設定しましたが、呼び出されると代わりに実行されます。Ubuntu 12.04/bin/bash/etc/bash.bashrc/etc/profile

以前に使用したことがない場合は、jailkitポイントは次のとおりです。

  1. システムルートの「jail」バージョンは、/home/jailのようなどこかに作成されます。
  2. 刑務所に閉じ込められたユーザーのホームディレクトリは、このフォルダ内に移動されます(例:/home/jail/home/testuser)。
  3. 制限された /etc/passwd を含む関連する構成ファイルが /home/jail/etc/ にコピーされます。
  4. /bin/bash などの適切なディレクトリへのアクセスを許可するプログラムをコピーします。
  5. 刑務所に閉じ込められたユーザーがログインすると、/etc/jail/としてルートが指定され、そのファイルを表示できません。

だから、次の項目を持つ人がいますtestuser/etc/passwd

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)運がありませんでした。

ベストアンサー1

通常、bashはログインプログラムがそれを呼び出すとbashに名前を付けるので、これはログインシェルであることを知っています-bash。名前は、argv[0]ユーザーがプログラムを呼び出す従来の方法である0番目のコマンドライン引数にあります。初期ハイフンは、ログインシェルであることをシェルに通知するルールです。--loginBashのオプションや-l。バラよりログインシェルと非ログインシェルの違いは何ですか?詳細については。

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ログインシェルを呼び出す簡単な方法があることを望みました。機能リクエストを送信することをお勧めします。

おすすめ記事