web-dev-qa-db-ja.com

ユーザーのホームディレクトリの決定

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が期待どおりに機能するように修正する方法を知っている人はいますか?

4
karlosss

/etc/passwdで検索することは、ローカルユーザーアカウントにとって正しいことです(システム管理者が物事を困難にするために邪魔にならない限り)。正しい一般的な答えは、ユーザーアカウントを含むユーザーデータベースを検索することです。 LDAP。最近のほとんどのシステムでは、 [〜#〜] nss [〜#〜] を使用してユーザーデータベースを一覧表示しているため、システムに /etc/nsswitch.conf があると思われる場合はチェックしてください。非ローカルアカウント。

アプリケーションの観点からすると、正解は、ホームディレクトリはHOME環境変数が何を言っているかということです。

ログインプログラム(loginsshd、Xディスプレイマネージャーなど)は通常、HOME環境変数をログインしているユーザーのホームディレクトリに設定します。 ” suSudoなどのユーザー変更プログラムはHOMEをに変更します(Sudoの場合、構成とコマンドラインオプションによって異なります)。したがって、通常、「現在のユーザーのホームディレクトリ」の定義は、「ユーザーのホームディレクトリ」と「現在のユーザー」の組み合わせと一致します。

ただし、chrootHOMEを変更しないため、chrootのセッションは親プロセスのHOME環境変数を継承します。これは当然のことながら/rootです。 bashでは、他のシェルと同様に、~HOMEの値に展開され、HOMEが設定されていない場合はデフォルトでユーザーデータベースルックアップになります。

解決策:HOMEの設定を解除します。

env -u HOME chroot --userspec=test path/to/subsystem/ /bin/bash