您需要了解的有关 Linux 中的 UID 的所有重要信息
Linux 中的 UID 是什么?
UID 代表用户标识符。UID 是分配给每个 Linux 用户的一个数字。它是用户在Linux 内核中的表示。UID 用于在系统内识别用户并确定用户可以访问哪些系统资源。这就是用户 ID 应该是唯一的原因。
您可以在 /etc/passwd 文件中找到 UID。该文件还可用于列出 Linux 系统中的所有用户。
使用Linux 命令查看文本文件,您将看到有关系统上现有用户的各种信息。
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
johndoe:x:1000:1000:John Doe,,,:/home/helder:/bin/bash
davmail:x:127:65534::/var/lib/davmail:/usr/sbin/nologin
statd:x:128:65534::/var/lib/nfs:/usr/sbin/nologin
这里的第三个字段代表用户ID或者UID。
请注意,在大多数 Linux 发行版中,UID 1-500 通常为系统用户保留。在 Ubuntu 和 Fedora 中,新用户的 UID 从 1000 开始。
例如,如果您使用 adduser 或useradd 命令来创建一个新用户,它将获取 1000 之后的下一个可用数字作为其 UID。
在 Linux 中,UID 0 和 GID 0 是为 root 用户保留的。
如何在 Linux 中查找用户的 UID?
您始终可以依赖 /etc/passwd 文件来获取用户的 UID。这不是在 Linux 中获取 UID 信息的唯一方法。
Linux 中的 id 命令将显示当前用户所属的 UID、GID 和组:
id
uid=1000(abhishek) gid=1000(abhishek) groups=1000(abhishek),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),127(kvm)
您还可以使用 id 命令指定用户名来获取任何 Linux 用户的 UID:
id standard
uid=1001(standard) gid=1001(standard) groups=1001(standard)
如何在 Linux 中更改用户的 UID?
假设您的 Linux 系统上有多个用户。您必须删除一个用户,因为他/她离开了组织。现在您希望系统中已有的另一个用户占用其 UID。
您可以使用 usermod 命令修改用户来更改 UID,如下所示:
usermod -u 1004 user_2
您需要具有超级用户权限才能执行上述命令。
你还记得Linux 中的文件权限和所有权概念吗?文件的所有权由所有者用户的 UID 决定。
当您更新用户的 UID 时,该用户拥有的文件会发生什么情况?虽然 user_2 的主目录中的所有文件的关联 UID 都会更改,但您必须手动更新主目录之外的其他文件的关联 UID。
您可以做的是手动更新与 user_2 的旧 UID 关联的文件的所有权。
find / -user old_uid_of_user_2 -exec chown -h user_2 {} \;
UID 如何与不同的系统资源关联?[针对高级用户]
UID 彼此唯一,因此它们也可用于识别不同系统资源(例如文件和进程)的所有权。
UID 和文件
我希望您熟悉 Linux 中的文件权限概念。当您创建文件时,您就是该文件的所有者。现在您可以决定谁可以对该文件做什么。这是 Linux DAC 机制的一部分,每个文件都由其所有者自行决定。
您可以使用 ls 或stat 命令来读取文件的所有权。让我们使用流行的 ls 命令来执行此操作,并检查二进制文件sleep
或的所有权passwd
。
如你所见,文件 /usr/bin/sleep 属于 root:
ls -l $(which sleep)
-rwxr-xr-x 1 root root 39048 Mar 6 2020 /usr/bin/sleep
让我们强制它使用 UID 而不是用户名来映射所有权:
ls -lhn $(which sleep)
-rwxr-xr-x 1 0 0 39K Mar 6 2020 /usr/bin/sleep
这里有一条有趣的信息。您的操作系统不理解“用户名”。每当程序需要使用用户名或需要打印用户名时,它都会参考该/etc/passwd
文件来提取信息。
你不必相信我的话。你可以自己用 strace 程序看看,它会打印出程序进行的所有系统调用。
strace ls -lhn $(which sleep) 2>&1 | grep passwd
您想查看的是ls
命令是否正在尝试读取/etc/passwd
文件。
strace ls -lh $(which sleep) 2>&1 | grep passwd
openat(AT_FDCWD, "/etc/passwd", O_RDONLY|O_CLOEXEC) = 6
到目前为止,一切都很好。
UID 和进程
进程也有所有者,就像文件一样。只有进程的所有者(或 root 用户)才能向其发送进程信号。这就是 UID 发挥作用的地方。
如果普通用户尝试终止另一个用户的进程,则会导致错误:
kill 3708
bash: kill: (3708) - Operation not permitted
只有进程的所有者或根用户才能执行此操作。
进程必须受到监管。监管意味着你需要有一种方法来限制或了解进程允许执行多少操作。这由其 UID 决定。
与进程关联的 UID 有三种类型。
- 真实 UID:真实 UID 是进程从其父进程采用的 UID。简单来说,无论谁启动进程,该用户的 UID 都是进程的真实 UID。这有助于识别进程真正属于谁。这很重要,尤其是当有效 UID 与我接下来要讨论的真实 UID 不同时。
- 有效 UID:这主要决定了某个进程真正拥有的权限。虽然用户可以启动进程,但它可以使用其他用户的可用权限运行。该命令
passwd
就是一个例子。此程序编辑文件/etc/shadow
,该文件是root
所有者。因此,普通用户不应该能够运行此命令或更改其密码。幸运的是,二进制文件以有效 UID 0(即 root)运行,这使它拥有足够的权限来编辑文件。除了启用SUID 位的二进制文件/etc/shadow
的情况外,实际和有效 UID 大致相同。 - 已保存的 UID:进程可用的 UID。这个 UID 通常不使用,但如果进程知道它不会执行任何特权工作,因此它可以将其有效 UID 更改为非特权 UID,则仍会使用该 UID。这减少了无意不当行为的表面。
就是这样。我希望你现在对 Linux 中的 UID 有了更好的了解。如果有任何问题,请随时提出。
作为专业的 Linux 用户,如果您认为我遗漏了有关 UID 的一些重要概念,请在评论部分告诉我。