jailkit
をインストールしました Ubuntu 12.04
で ユーザーのシェルを/bin/bash
に設定しました –ただし、呼び出されると、/etc/bash.bashrc
が実行されます。 /etc/profile
の代わりに
jailkit
を使用したことがない場合 その要点は次のとおりです:
- システムルートの「jailed」バージョンは、/ home/jailのようにどこかに作成されます
- 投獄されたユーザーのホームディレクトリは、/ home / jail / home/testuserのようにそのフォルダ内に移動されます
- 関連する構成ファイルは/home/ jail / etc /にコピーされます–限定された/ etc/passwdを含みます
- アクセスを許可するプログラムは、
/ bin / bash
などの対応するディレクトリにコピーされます。 - 投獄されたユーザーがログインすると、/ etc / jail /にchrootされ、それより上のファイルは表示されません
だから私は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)
も調べました 運が悪かった。
承認された回答:
通常、bashは、ログインプログラムがそれを呼び出すと、その名前が-bash
であることをbashに通知するため、それがログインシェルであることを認識します。 。その名前はargv[0]
にあります 、ゼロ番目のコマンドライン引数。これは通常、ユーザーがプログラムを呼び出す方法です。最初のハイフンは、ログインシェルであることをシェルに通知するための規則です。オプション--login
を渡すと、Bashはログインシェルとしても動作します。 または-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
を期待していました ログインシェルを呼び出す簡単な方法があります。機能をリクエストすることをお勧めします。