我需要知道如何确定 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
Run Code Online (Sandbox Code Playgroud)
我真的不知道发生了什么。这是我以 root 身份输入的子系统chroot --userspec=test path/to/subsystem/ /bin/bash。有谁知道这是什么,以及如何解决它,这样~膨胀到/home/test与cd作品如预期?
查找/etc/passwd本地用户帐户是正确的(除非系统管理员特意使事情变得困难)。正确的一般答案是在包含用户帐户的用户数据库中查找,例如 LDAP。大多数现代系统使用NSS来列出用户数据库,因此/etc/nsswitch.conf如果您认为可能存在非本地帐户,请检查您的系统。
从应用程序的角度来看,正确的答案是主目录是HOME环境变量所说的任何内容。
登录程序(login,sshd, X 显示管理器等)通常将HOME环境变量设置为登录用户的主目录。 “高级”用户更改程序,例如su和sudo更改HOME为(使用sudo,这取决于配置和命令行选项)。所以通常情况下,“当前用户家目录”的定义与“用户家目录”和“当前用户”的组合相匹配。
但是chroot不会改变HOME,所以你在 chroot 中的 session 继承自HOME父进程中的环境变量,这并不奇怪/root。在 bash 中,与任何其他 shell 一样,~扩展为 的值HOME,如果HOME未设置,则默认为用户数据库查找。
解决方案:取消设置HOME。
env -u HOME chroot --userspec=test path/to/subsystem/ /bin/bash
Run Code Online (Sandbox Code Playgroud)