我可以访问两个用户的 UID 为 0 的系统:
host:~ # cat -n /etc/passwd | grep -E "root|testuser"
1 root:x:0:0:root:/root:/bin/bash
31 testuser:x:0:0:testuser:/root/testuser:/bin/bash
host:~ #
Run Code Online (Sandbox Code Playgroud)
例如,这通常会导致我使用用户名通过 SSH(基于密钥的身份验证)进入该系统的行为,testuser
并且我被识别为root
:
host:~ # id
uid=0(root) gid=0(root) groups=0(root)
host:~ # ls -ld /root/testuser
drwxr-xr-x 3 root root 352 Jan 25 01:02 /root/testuser
host:~ #
host:~ # ls -ld /root/testuser/.ssh/
drwx------ 2 root root 80 Nov 18 15:38 /root/testuser/.ssh/
host:~ #
Run Code Online (Sandbox Code Playgroud)
但是,在登录会话中间,我有时会被识别为testuser
:
host:~ # ls -ld /root/testuser
drwxr-xr-x 3 testuser root 352 Dec 16 18:39 /root/testuser
host:~ #
Run Code Online (Sandbox Code Playgroud)
这并没有困扰我,但我很困惑我怎么可能总是可以通过 SSH 连接到这台机器,因为testuser
这样重复的 UID 设置也会弄乱/root/testuser/.ssh/
目录和/root/testuser/.ssh/authorized_keys
文件的所有权。
没有“多个用户具有相同的 UID”这样的东西。UID 标识用户。相同的 UID,相同的用户。
您创建的是同一个用户登录的两种不同方式。用户是 UID 0。UID 0 可以使用名称登录root
,使用在root
条目中定义的密码/etc/shadow
,当使用这些凭据时,HOME
环境变量是设置为/root
,程序/bin/bash
运行。UID 0 也可以使用 name 登录testuser
,使用在testuser
条目中定义的密码/etc/shadow
,并且当使用这些凭据时,HOME
环境变量设置为/root/testuser
并且程序/bin/bash
运行。
内核只知道用户 ID,而不知道用户名。文件系统只存储用户 ID,不存储用户名。用户名不用于对系统对象(如文件和进程)的访问控制。大多数程序在需要显示涉及用户的信息时将用户 ID 转换为用户名,而在需要实现某些涉及用户的策略时将用户名转换为用户 ID。
您查看的文件属于用户 0。当您运行时ls
,它会收到文件所有者为 0 的信息,并检索有关用户 0 的信息,以便以更友好的方式显示它。这通常会返回 中的第一个条目/etc/passwd
,我无法解释为什么您testuser
偶尔会看到。
许多工具隐含地假设用户名和用户 ID 之间存在一一对应的关系,因此如果用户有多个名称,则行为并不总是最佳的。你真的不应该这样做;它主要会起作用,但您需要准备好应对偶尔的奇怪情况。