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 开始。
为了 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 与进程相关联。
- 真实的 UID:Real UID是进程从其父进程采用的UID。 简单来说,无论谁启动了一个进程,该用户的 UID 就是该进程的真实 UID。 这有助于确定进程真正属于谁。 这是必不可少的,尤其是当有效 UID 与我接下来要讨论的真实 UID 不同时。
- 有效的 UID:这主要决定了某个进程真正拥有的权限。 虽然用户可以启动该进程,但它可以使用不同用户的可用权限运行。 命令
passwd
是一个 example 这个的。 该程序编辑文件/etc/shadow
,即root
拥有。 因此,普通用户不应该能够运行此命令或更改他/她的密码。 幸运的是,二进制文件以 0 的有效 UID(即 root)运行,这使它有足够的权限来编辑/etc/shadow
文件。 除了启用 SUID 位的二进制文件外,真实和有效的 UID 基本相同。 - 保存的 UID: 可供进程使用的 UID。 这个通常不使用,但如果进程知道它不会执行任何特权工作,它仍然存在,因此它可以将其有效 UID 更改为非特权的东西。 这减少了无意的不当行为的表面。
就是这样。 我希望您现在对 Linux 中的 UID 有更好的了解。 不要犹豫,问你的问题,如果有的话。
作为一名专业的 Linux 用户,如果您认为我错过了有关 UID 的一些重要概念,请在评论部分告诉我。