Linux 中的 UID 是什么?如何查找用户的UID?
本 Linux 基础知识指南向您介绍与 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 和进程
进程也有所有者,就像文件一样。只有进程的所有者(或根用户)才能向其发送进程信号。这就是 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)运行,这使其能够拥有足够的权限来编辑/etc/shadow
文件。除了启用 SUID 位的二进制文件之外,实际 UID 和有效 UID 大多相同。已保存的 UID:可供进程使用的 UID。这个通常不被使用,但仍然存在,以防进程知道它不会执行任何特权工作,因此它可以将其有效 UID 更改为非特权的东西。这减少了无意的不当行为的表面。
就是这样。我希望您现在对 Linux 中的 UID 有更好的了解。如果有任何问题,请随时提出。
作为一名专业的 Linux 用户,如果您认为我错过了一些有关 UID 的重要概念,请在评论部分告诉我。