Linux用戶ID和組ID
在 Linux 系統中,用戶和組 ID 用于識別進程和文件的訪問權限。每個進程都有與之關聯的實際用戶 ID、實際組 ID、有效用戶 ID、有效組 ID 以及附屬組 ID。
實際用戶 ID (Real User ID, UID)
定義:實際用戶 ID 是啟動進程的用戶的 ID。
作用:標識執行該進程的用戶。
獲取:使用 getuid() 函數可以獲取實際用戶 ID。
實際組 ID (Real Group ID, GID)
定義:實際組 ID 是啟動進程的用戶組的 ID。
作用:標識執行該進程的用戶組。
獲取:使用 getgid() 函數可以獲取實際組 ID。
有效用戶 ID (Effective User ID, EUID)
定義:有效用戶 ID 用于控制進程對文件系統資源的訪問權限。
作用:決定進程的訪問權限。例如,具有 root 權限的進程可以通過將 EUID 設置為 0 來獲得特權操作的權限。
獲取:使用 geteuid() 函數可以獲取有效用戶 ID。
有效組 ID (Effective Group ID, EGID)
定義:有效組 ID 用于控制進程對文件系統資源的訪問權限。
作用:與有效用戶 ID 類似,決定進程在組級別上的訪問權限。
獲取:使用 getegid() 函數可以獲取有效組 ID。
附屬組 ID (Supplementary Group IDs)
定義:附屬組 ID 是用戶所屬的其他組的 ID 列表,除了實際組 ID 和有效組 ID 之外。
作用:允許進程獲得多個組的權限,從而可以訪問更多的資源。
獲取:使用 getgroups() 函數可以獲取附屬組 ID 列表。
以下代碼演示如何獲取并打印這些 ID:
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <grp.h> int main() { uid_t uid = getuid(); gid_t gid = getgid(); uid_t euid = geteuid(); gid_t egid = getegid(); printf("Real User ID: %dn", uid); printf("Real Group ID: %dn", gid); printf("Effective User ID: %dn", euid); printf("Effective Group ID: %dn", egid); int ngroups = 10; gid_t groups[10]; if (getgroups(ngroups, groups) == -1) { perror("getgroups"); } else { printf("Supplementary Group IDs: "); for (int i = 0; i < ngroups; i++) { printf("%d ", groups[i]); } printf("n"); } return 0;}
了解和正確使用這些 ID 是管理 Linux 系統權限的重要基礎。實際用戶 ID 和實際組 ID 標識了執行進程的用戶和組,而有效用戶 ID 和有效組 ID 決定了進程的權限。附屬組 ID 則允許進程在多個組中進行操作,靈活性更高。
總結一下這些ID的特點:
實際用戶 ID (UID) 和 實際組 ID (GID) 標識了進程的擁有者,即誰啟動了這個進程。它們通常不會改變。
有效用戶 ID (EUID) 和 有效組 ID (EGID) 用于訪問權限控制,決定了進程對系統資源的訪問權限。這些 ID 可以在程序運行過程中改變(例如,通過 setuid 系統調用)。
附屬組 ID 列出了用戶所屬的所有其他組,這些組可以給予用戶額外的權限。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。