用户ID
用户ID(英語:user identifier,一般缩写为User ID或UID),全称用户标识符,在类UNIX系统中是内核用来辨识用户的一个无符号整型数值,亦是UNIX文件系统与进程的必要组成部分之一。
数值范围
编辑在不同的系统中,UID的值的范围也有所不同,但一般来说UID都是由一个15位的整数表示,其范围在0~32767之内,且有如下限制:
- 超级用户的UID总为0;
- 按传统的做法,“nobody”(类UNIX系统的一种特殊账户)与超级用户相反,总占有数值最大的PID,即32767;相对应的,现今的系统为nobody分配的UID则在系统保留范围(1~100)或是65530-65535的范围内[1]。
- 数值于1~100内的UID约定预留给系统使用,有些手册则推荐在此基础上再预留101~499(如RHEL[2])甚至是101~999(如Debian[1])的UID以作备用;而相对应的,在Linux中用useradd命令创建第一个用户时,默认为之分配的UID则为1000。
除此之外,有些特殊的系统也支持16位的UID,因而UID的数目可以扩展到65536个;现代系统支持32位的UID,这也使UID数目进一步扩充到4,294,967,296个成为可能。
分类
编辑有效用户ID
编辑有效用户ID(Effective UID,即EUID)与有效用户组ID(Effective Group ID,即EGID)在创建与访问文件的时候发挥作用;具体来说,创建文件时,系统内核将根据创建文件的进程的EUID与EGID设定文件的所有者/组属性,而在访问文件时,内核亦根据访问进程的EUID与EGID决定其能否访问文件。
真实用户ID
编辑真实用户ID(Real UID,即RUID)与真实用户组ID(Real GID,即RGID)用于辨识进程的真正所有者,且会影响到进程发送信号的权限。没有超级用户权限的进程仅在其RUID与目标进程的RUID相匹配时才能向目标进程发送信号,例如在父子进程间,子进程从父进程处继承了认证信息,使得父子进程间可以互相发送信号。
暂存用户ID
编辑暂存用户ID(Saved UID,即SUID)于以提升权限运行的进程暂时需要做一些不需特权的操作时使用,这种情况下进程会暂时将自己的有效用户ID从特权用户(常为root)对应的UID变为某个非特权用户对应的UID,而后将原有的特权用户UID复制为SUID暂存;之后当进程完成不需特权的操作后,进程使用SUID的值重置EUID以重新获得特权。在这里需要说明的是,无特权进程的EUID值只能设为与RUID、SUID与EUID(也即不改变)之一相同的值。
文件系统用户ID
编辑文件系统用户ID(File System UID,即FSUID)在Linux中使用,且只用于对文件系统的访问权限控制,在没有明确设定的情况下与EUID相同(若FSUID为root的UID,则SUID、RUID与EUID必至少有一亦为root的UID),且EUID改变也会影响到FSUID。设立FSUID是为了允许程序(如NFS服务器)在不需获取向给定UID账户发送信号的情况下以给定UID的权限来限定自己的文件系统权限。
杂项
编辑- UID的数值与用户账户的对应关系存放于/etc/passwd中[3]。用于存放密码的/etc/shadow以及网络信息服务也以UID的数值标识用户,但现在Linux系统下的shadow文件已经改用账户名来标识用户。
- 在遵循POSIX的环境中,id这一命令可以给出当前用户的用户名、所属组及对应的UID、GID的值[3]。
参考文献
编辑引用
编辑- ^ 1.0 1.1 DebianHelp.co.uk. Usernames and User IDs in Debian Linux. [2011-12-22]. (原始内容存档于2021-01-10).
- ^ Red Hat Documents. Red Hat Enterprise Linux-Specific Information. [2011-12-22]. (原始内容存档于2012-07-07).
- ^ 3.0 3.1 UnixTutorial.org. How To Find Out User ID in Unix. [2011-12-22]. (原始内容存档于2011-12-24).
来源
编辑- 《UNIX环境高级编程》, 理查德·史蒂文斯 著