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