Linux 中真实、有效和保存的用户 ID
类 Unix 操作系统中的每个用户都由一个不同的整数标识,这个唯一的数字称为 UserID。
一个进程定义了三种UID,可以根据任务的权限动态改变。
定义的三种不同类型的 UID 是:
1.真实用户ID
2.有效用户ID
3.保存的用户ID
1. Real UserID :对于一个进程,Real UserId 就是启动它的用户的UserID。它定义了该进程可以访问哪些文件。
2. Effective UserID :通常与 Real UserID 相同,但有时会更改为使非特权用户能够访问只有 root 等特权用户才能访问的文件。
如果您看到 /usr/bin/passwd 文件的权限:
-rwsr-xr-x 1 root root 59640 Mar 23 2019 /usr/bin/passwd
因此,如果非root 用户运行此文件,则该进程的EUID 将为“0”,即root 和UID 保持与原始用户相同。
3. Saved UserID :当一个以提升权限运行的进程(一般是root)需要做一些低权限工作时使用,这可以通过临时切换到非特权帐户来实现。
在执行低权限工作时,将有效的 UID 更改为某个较低的权限值,并将 euid 保存到保存的 userID(suid) 中,以便在任务完成时切换回特权帐户。
您只需在终端上键入id即可打印 UID:
# id
输出:
uid=1000(mandeep) gid=1000(mandeep)
groups=1000(mandeep), 4(adm), 24(cdrom),
27(sudo), 30(dip), 46(plugdev), 113(lpadmin),
128(sambashare)
id命令可用于打印真实有效的用户和组 ID
id的不同选项:
-g, --group : print only effective group id
-G, --groups : print all group IDs
-r, --real : print only real user id
-u, --user : print only effective user id
例如 :
id -g
输出 :
1000
注意:当你使用带有 -r 选项的 id 命令时,你会得到类似的错误
id: cannot print only names or real IDs in default format
要解决此问题,请将 -r 选项与其他选项结合使用,例如id -rg
现在,为了设置真实用户 ID、有效用户 ID 和调用进程保存的 set-user-ID,我们使用setresuid()和setresgid()
句法 :
int setresuid(uid_t ruid, uid_t euid, uid_t suid); # for specific user
int setresgid(gid_t rgid, gid_t egid, gid_t sgid); # for specific group
返回值:
成功时,返回 0。
出错时,返回 -1。
更多详细信息:使用 Linux 手册页(man 用户 ID)。