前言
在 Linux 系統中,檔案與資料夾的權限管理是系統安全的核心支柱,而「群組(Group)」正是實現多使用者協作與權限控管的重要機制。雖然許多初學者習慣使用 useradd 來建立帳號,但往往忽略了群組的獨立管理。事實上,透過 groupadd 和 groupmod 這兩個指令,管理員可以更靈活地配置系統資源,例如設定 GID(群組識別碼)、管理系統群組或調整群組成員資格。
本文將深入解析這兩個指令的用法,提供在 Ubuntu 22.04 與 Debian 12 環境下可直接執行的範例,幫助你掌握群組管理的精髓。
groupadd:建立新的群組
groupadd 指令用於在系統中建立新的群組。當我們建立一個新使用者時,系統通常會自動建立一個與使用者名稱相同的名義群組(Private Group),但有時我們需要建立共享群組,讓多個使用者共同擁有特定目錄的寫入權限。
基本用法與預設行為
最簡單的用法是直接指定群組名稱:
sudo groupadd developers
執行後,系統會在 /etc/group 中新增一行,並自動分配一個未使用的 GID(通常在 GROUP_MAX 範圍內,Debian/Ubuntu 預設從 1000 開始)。
指定特定的 GID
在企業環境中,為了便於識別或符合資安規範,我們可能需要指定特定的 GID。使用 -g 選項可以達成此目的:
sudo groupadd -g 1500 engineering
注意事項: 指定的 GID 必須是唯一的。如果該 GID 已被使用,指令會失敗並顯示錯誤訊息。
建立系統群組
系統群組(System Group)通常用於執行背景服務或守護進程,其 GID 小於 LOGIN_ID_MIN(預設為 1000)。建立系統群組時,請使用 -r 選項:
sudo groupadd -r webadmin
這類群組不會出現在一般使用者的 /etc/group 顯示列表中(若使用 getent 則可見),有助於保持使用者群組列表的整潔。
groupmod:修改現有群組資訊
當群組建立後,若因組織調整需要更改群組名稱,或需要調整 GID 以符合新的資源映射規則,groupmod 便是不可或缺的指令。
修改群組名稱
使用 -n 選項可以變更群組名稱。這不會影響群組內的成員資格,也不會改變檔案的群組權限(因為檔案儲存的是 GID,而非群組名稱):
sudo groupmod -n dev_team developers
上述指令將 developers 群組的名稱改為 dev_team。你可以使用 getent group dev_team 來驗證變更是否生效。
修改 GID
若需變更群組的 GID,請使用 -g 選項:
sudo groupmod -g 2000 dev_team
同樣地,請確保新的 GID 尚未被其他群組使用。若該 GID 已被佔用,系統會拒絕執行並提示衝突。
修改群組密碼(較少使用)
雖然現代 Linux 系統多採用 /etc/gshadow 管理群組密碼,但 groupmod 仍支援 -p 選項來設定群組密碼(需以明文輸入,建議搭配 chgrp 或手動編輯 /etc/gshadow 使用)。不過,基於安全考量,現代管理員較少直接透過指令設定群組密碼。
常見問題與解決方案
Q1: 執行 groupadd 時出現 "group 'xxx' already exists" 錯誤?
這表示該群組名稱已存在。Linux 系統不允許同名群組。請先使用 getent group xxx 確認該群組是否存在,並檢查其 GID 與成員。若需合併群組,應手動調整 /etc/group 和 /etc/gshadow,或將使用者移至新群組後刪除舊群組。
Q2: 修改群組名稱後,檔案的群組權限會自動更新嗎?
不會。 檔案系統儲存的是 GID(數字),而非群組名稱(字串)。因此,即使使用 groupmod -n 更改群組名稱,該群組擁有的檔案其群組 ID 仍保持不變,但透過 ls -l 查看時,會顯示新的群組名稱。若需更改檔案的群組擁有者,必須使用 chgrp 指令手動調整。
小結
groupadd 與 groupmod 是 Linux 系統管理中基礎卻強大的工具。透過合理使用 -g、-r、-n 等選項,管理員可以精確控制群組的識別碼與名稱,進而實現更細緻的檔案權限管理。建議在執行修改操作前,務必備份 /etc/group 與 /etc/gshadow 檔案,以防意外發生。掌握這些指令,將使你在使用者與群組管理上更加得心應手。