关于 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 中 /etc/passwd 文件中的 UID 和 GID

请注意,在大多数 Linux 发行版中,UID 1-500 通常是为系统用户保留的。 在 Ubuntu 和 Fedora新用户的 UID 从 1000 开始。

为了 example,如果你使用 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如何与不同的系统资源相关联? [for advanced users]

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 与进程相关联。

  1. 真实的 UID:Real UID是进程从其父进程采用的UID。 简单来说,无论谁启动了一个进程,该用户的 UID 就是该进程的真实 UID。 这有助于确定进程真正属于谁。 这是必不可少的,尤其是当有效 UID 与我接下来要讨论的真实 UID 不同时。
  2. 有效的 UID:这主要决定了某个进程真正拥有的权限。 虽然用户可以启动该进程,但它可以使用不同用户的可用权限运行。 命令 passwd 是一个 example 这个的。 该程序编辑文件 /etc/shadow,即 root 拥有。 因此,普通用户不应该能够运行此命令或更改他/她的密码。 幸运的是,二进制文件以 0 的有效 UID(即 root)运行,这使它有足够的权限来编辑 /etc/shadow 文件。 除了启用 SUID 位的二进制文件外,真实和有效的 UID 基本相同。
  3. 保存的 UID: 可供进程使用的 UID。 这个通常不使用,但如果进程知道它不会执行任何特权工作,它仍然存在,因此它可以将其有效 UID 更改为非特权的东西。 这减少了无意的不当行为的表面。

就是这样。 我希望您现在对 Linux 中的 UID 有更好的了解。 不要犹豫,问你的问题,如果有的话。

作为一名专业的 Linux 用户,如果您认为我错过了有关 UID 的一些重要概念,请在评论部分告诉我。