Linuxユーザーのホームディレクトリがどのように決定されるかを知る必要があります。みんなの答えは「ねえ、/etc/passwd
を見て見つけて」だろう。しかし、これは常に正しいとは限らないようです。これを見てください:
$ whoami
test
$ cat /etc/passwd
test:x:2000:2000::/home/test:/bin/bash (relevant line)
$ echo ~
/root
$ cd
bash: cd: /root: No such file or directory
何が起こっているのか本当にわかりません。 chroot --userspec=test path/to/subsystem/ /bin/bash
によってrootとして入力したサブシステムです。これが何であるか、そして~
が/home/test
に展開され、cd
が期待どおりに機能するように修正する方法を知っている人はいますか?
/etc/passwd
で検索することは、ローカルユーザーアカウントにとって正しいことです(システム管理者が物事を困難にするために邪魔にならない限り)。正しい一般的な答えは、ユーザーアカウントを含むユーザーデータベースを検索することです。 LDAP。最近のほとんどのシステムでは、 [〜#〜] nss [〜#〜] を使用してユーザーデータベースを一覧表示しているため、システムに /etc/nsswitch.conf
があると思われる場合はチェックしてください。非ローカルアカウント。
アプリケーションの観点からすると、正解は、ホームディレクトリはHOME
環境変数が何を言っているかということです。
ログインプログラム(login
、sshd
、Xディスプレイマネージャーなど)は通常、HOME
環境変数をログインしているユーザーのホームディレクトリに設定します。 ” su
やSudo
などのユーザー変更プログラムはHOME
をに変更します(Sudoの場合、構成とコマンドラインオプションによって異なります)。したがって、通常、「現在のユーザーのホームディレクトリ」の定義は、「ユーザーのホームディレクトリ」と「現在のユーザー」の組み合わせと一致します。
ただし、chroot
はHOME
を変更しないため、chrootのセッションは親プロセスのHOME
環境変数を継承します。これは当然のことながら/root
です。 bashでは、他のシェルと同様に、~
はHOME
の値に展開され、HOME
が設定されていない場合はデフォルトでユーザーデータベースルックアップになります。
解決策:HOME
の設定を解除します。
env -u HOME chroot --userspec=test path/to/subsystem/ /bin/bash