id 指令:確認 UID 與群組、whoami、groups 與附加群組
在 Linux 伺服器上要確認目前帳號的 UID 與群組時使用 id 指令,只需要帳號名稱時使用 whoami,只需要群組名稱時使用 groups。在 AlmaLinux 9 與 Debian 12 伺服器上依序執行三個指令並比較輸出後,id -un 與 whoami 輸出相同的帳號名稱,groups 則把 id 的群組清單只留下名稱輸出。
以下輸出是在 AlmaLinux 9.8 伺服器以 root 帳號、在 Debian 12 伺服器以一般帳號執行的結果。登入帳號的名稱與編號、附加群組已換成範例值(user1、1000、adm、systemd-journal)。
1️⃣ id 指令的基本用法
不加選項執行 id,會以一行顯示執行目前 Shell 的帳號資訊。以 root 帳號執行時,三個欄位都是 0(root)。
iduid=0(root) gid=0(root) groups=0(root)uid 欄位是帳號的編號與名稱,gid 欄位是主要群組(primary group)的編號與名稱。groups 欄位是該帳號所屬的全部群組,主要群組排在最前面。
在 id 後面寫上帳號名稱,就會輸出該帳號的資訊。確認有附加群組的一般帳號 user1 後,groups 欄位在主要群組 user1 之後接著 adm 與 systemd-journal。主要群組以外另外所屬的這些群組就是附加群組(supplementary group)。
id user1uid=1000(user1) gid=1000(user1) groups=1000(user1),4(adm),190(systemd-journal)許多帳號的 UID 與 gid 編號相同,容易把兩個數字當成同一個值,但伺服器預設就有的 adm 帳號 UID 是 3,主要群組編號是 4。operator 帳號的主要群組是 root。
id admuid=3(adm) gid=4(adm) groups=4(adm)id operatoruid=11(operator) gid=0(root) groups=0(root)寫上多個帳號時,會一行輸出一個。
id root binuid=0(root) gid=0(root) groups=0(root)
uid=1(bin) gid=1(bin) groups=1(bin)寫上不存在的帳號時,會出現 [no such user] 錯誤,結束代碼是 1。
id no-such-user9id: 'no-such-user9': no such userecho $?1寫上存在的帳號時結束代碼是 0,因此可以在指令稿中當作確認帳號是否存在的條件。
2️⃣ id 指令的選項
要從完整輸出中只把一個編號交給指令稿時,用選項只選一個欄位。-u 輸出 UID,-g 輸出主要群組編號,-G 輸出所屬群組的全部編號。
id -u0id -u daemon2id -G user11000 4 190搭配 -n 時,會顯示名稱而不是編號。用 [id -Gn] 確認 user1 的群組後,三個編號變成了三個名稱。
id -Gn user1user1 adm systemd-journalid -gn user1user1-n 與 -r 要和 -u、-g、-G 其中之一搭配使用。單獨寫 -n 時出現了下面的錯誤。
id -nid: cannot print only names or real IDs in default format-r 會輸出實際(real)ID 而不是有效(effective)ID。在 root 帳號的 Shell 執行 [id -ur] 後輸出 0。像 -u 與 -g 這樣選擇編號的選項同時寫兩個以上時,會出現 [cannot print "only" of more than one choice] 錯誤。選項整理如下。
| 選項 | 複製 | 說明 |
|---|---|---|
| -u--user | 輸出 UID 編號 | |
| -g--group | 輸出主要群組編號 | |
| -G--groups | 輸出所屬群組的全部編號 | |
| -n--name | 與 -u、-g、-G 搭配,輸出名稱而不是編號 | |
| -r--real | 與 -u、-g、-G 搭配,輸出實際(real)ID 而不是有效 ID |
| 選項 | 複製 | 說明 |
|---|---|---|
| -Z--context | 只輸出處理程序的安全性內容 | |
| -z--zero | 輸出項目以 NUL 字元而不是空白分隔,預設格式中無法使用 | |
| -a | 為了與其他版本的 id 相容而只接受、不處理 | |
| --help | 輸出說明 | |
| --version | 輸出版本 |
🔲 id 指令模擬器
下方模擬器以有附加群組的 user1 帳號開始。用 [🖊 Other window] 按鈕加入 wheel 群組後,可以比較 [id] 與 [id user1],並用 [🔁 Log in again] 按鈕確認新 Shell 的群組。
3️⃣ whoami 指令與 id -un
只需要目前 Shell 的帳號名稱時,執行 whoami。man 頁面說明 whoami 是與 [id -un] 相同的指令。以 root 帳號執行這兩個指令後,兩者都輸出 root。
whoamirootid -unroot在 Debian 12 伺服器的一般帳號下,兩個指令也輸出相同的帳號名稱。
whoamiuser1id -unuser1whoami 輸出目前有效(effective)UID 對應的帳號名稱。它是只確認目前帳號的指令,因此後面加上帳號名稱會出現錯誤。
whoami user1whoami: extra operand 'user1'
Try 'whoami --help' for more information.其他帳號的名稱或編號,是在 id 後面寫上該帳號來確認。
id -un user1user1把 -un 換成 -u,同一個位置就會顯示 UID 編號而不是帳號名稱。
4️⃣ groups 指令與附加群組
groups 只以一行輸出群組名稱。不寫帳號名稱時會顯示目前 Shell 的群組,在 root 帳號下只有 root 一個。
groupsroot寫上帳號名稱時,會顯示帳號名稱與冒號後面的群組。寫上多個帳號時,一行輸出一個。
groups user1 daemonuser1 : user1 adm systemd-journal
daemon : daemon主要群組與附加群組記錄的位置不同。附加群組在群組資料庫(/etc/group)的第四個欄位寫成成員,主要群組則在帳號資訊(/etc/passwd)的第四個欄位寫成編號。
getent group admadm:x:4:user1getent group user1user1:x:1000:getent passwd daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinuser1 的主要群組 user1 群組,第四個欄位是空的,附加群組 adm 則把 user1 寫成成員。daemon 帳號那一行第四個欄位的 2 就是主要群組編號。
要把帳號加入附加群組時,使用 usermod 指令的 [usermod -aG 群組 帳號]。不加 -a 只用 -G 的話,會從沒寫在清單裡的既有附加群組中移除,因此要一併寫上 -a。
不寫帳號名稱執行的 groups,會輸出目前 Shell 處理程序的群組。man 頁面說明,群組資料庫變更後,這個值可能與資料庫不同。
因此剛變更群組後,要用 [groups 帳號] 或 [id 帳號] 確認資料庫中的群組,要套用到 Shell 則重新登入。保持登入狀態下變更目前群組 ID 的指令有 newgrp。
🔢 FAQ & 推薦內容
ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。