用戶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環境高級編程》, 理查德·史蒂文斯 著