home products tech support contact us

 Linux 技術支援    ⇒   基礎篇    進階篇    補腦篇    指令索引    中⇒ENG
版權所有, 引用請註明出處

 群組管理

1.0 群組管理
           /etc/group
           /etc/gshadow
       groupadd 新增群組
       vigr 修改 /etc/group
       groups 列出群組
       newgrp 切換群組
       gpasswd 設群組密碼和成員
       groupmod 修改群組
       groupdel 刪除群組
1.1 群組協同工-作
       chgrp 變更檔案所屬群組
       chown


 1.0 群組管理

useradd 建立帳號同時也會建立和帳號同名的預設群組(default group),但群組名稱不一定要和帳號同名且可加入一個以上的群組方便群組協同工作共享資源。

和帳號的兩個重要設定檔〝/etc/passwd〞、〝/etc/shadow〞類似,群組相對應的檔案為〝/etc/group〞和〝/etc/gshadow〞,因少了和時間有關的欄位故相對簡單許多。

^ back on top ^

groupadd 新增群組
或許 user 發現上面介紹過的指令 useradd 就有選項〝-g〞或〝-G〞可建立群組/附加群組?為什還要有此指令來新增群組?有疑問就實驗看看吧!

實驗建立〝附加群組〞:(以 Superuser 登入)
# useradd ccc -G sub_grp ←新增帳號〝ccc〞並建立附加群組〝sub_grp〞
useradd: unknown group sub_grp ←?? 不明的〝sub_grp〞群組

上例為什麼不能建立帳號時同時也建立附加群組 (supplementary groups)呢? 原因是某一帳號要加入某一附加群組,其群組名稱要記錄在〝/etc/group〞(還有相對應的〝/etc/gshadow〞),否則會拒絕為其加入。把群組名稱加到〝/etc/group〞其指令為 groupadd

例:
# groupadd sub_grp ←新增群組〝sub_grp〞
# tail -4 /etc/group ←確認看有無記錄在〝/etc/group〞
haldaemon:x:68:
aaa:x:500:
bbb:x:501:
sub_grp:x:502: ←新增群組在這 :-)
# useradd ccc -G sub_grp ←現在可新增帳號〝ccc〞時順便建立附加群組〝sub_grp〞
# tail -4 /etc/group ←查看〝/etc/group〞
vboxsf:x:491:
aaa:x:500:
bbb:x:501:
sub_grp:x:502:ccc ←群組〝sub_grp〞的成員有帳號〝ccc〞
ccc:x:503:

為新增的帳號加了附加群組後就可用 newgrp 來切換預設群組和附加的群組。

vigr 修改 /etc/group
指令 groupadd 主要在檔案〝/etc/group〞和〝/etc/gshadow〞加上群組名稱,也可用指令 vigr 利用 vi 來開啓和修改檔案〝/etc/group〞(如此檔有編輯過會詢問是否順便編制〝/etc/gshadow〞)可也達到指令 groupaddgroupdel 增減群組的功能。

groups 列出群組
groupadd 所舉的例子新增帳號〝ccc〞並建立附加群組〝sub_grp〞,接下來用新增的帳號登入來說明如何切換〝主群組〞(primary group)和〝附加群組〞(supplementary groups)。
(記得請 Superuser 用 passwd 為新增的帳號〝ccc〞設密碼,不然無法登入測試)。

例:(續上例,以剛新增的帳號〝ccc〞登入測試)
[ccc@localhost ~]$ groups ←列出目前帳號有那些群組
ccc sub_grp ←列出二個群組,這些群組皆為此帳號的〝群組成員〞(group emberships)

上例中用 groups 列出的群組第一個出現的為有效群組( effective group )。

newgrp 切換群組
groups 列出的群組成員都可用 newgrp 來切換, newgrp 指令會以一個子進程 shell 執行切換的群組,用 exit 回到原群組。

例:(續上例,以剛新增的帳號〝ccc〞登入測試)
[ccc@localhost ~]$ newgrp sub_grp ←切換到群組〝sub_grp〞
[ccc@localhost ~]$ groups ←看一下有效群組是否已變〝sub_grp〞
sub_grp ccc ←群組〝sub_grp〞在第一欄了
[ccc@localhost ~]$ echo 'hello' > test_grp.txt ←建立一檔案看一下檔案的群組屬誰
[ccc@localhost ~]$ ls -l test_grp.txt
-rw-r--r-- 1 ccc sub_grp 15 2016-09-06 14:26 test_grp.txt ←檔案群組已屬〝sub_grp〞
[ccc@localhost ~]$ exit ←退出目前的 Shell,群組會回到原主群組〝ccc〞
[ccc@localhost ~]$ groups ←看一下目前群組是否回到原主群組
ccc sub_grp ←群組〝ccc〞在第一欄了

newgrp 切換的有效群組是暫時的,exit 或重開機就恢復成預設群組(default group)。

^ back on top ^

gpasswd 設群組密碼和成員
如果系統管理員用 useradd 新增帳號時沒用〝-G〞選項建立附加群組,事後可用 gpasswd 來追加,此指令有二個主要功能,一是建立群組密碼,二是增減群組的成員,gpasswd 只有 Superuser 和群組管理員才可使用,用法如下:

語法:gpasswd [-otpiton] [USER_NAME][MEMBER]
指令名稱/功能/命令使用者 選項 功能
gpasswd/
(group passwd)設群組密碼和成員/
Superuser & Group administrator
-a 加入用戶到群組,(加在〝/etc/group〞和〝/etc/gshadow〞的 member 欄)
-d 從群組中刪除用戶(刪除〝/etc/group〞和〝/etc/gshadow〞的 member 欄)
-A 指定群組管理員(此選項只有 Superuser 才可用,指定的群組管理員加在〝/etc/gshadow〞Admin 欄)
-r 移除群組密碼 (刪除〝/etc/group〞和〝/etc/gshadow〞的密碼欄)
-R 鎖住群組 (此時〝/etc/gshadow〞的密碼欄開頭會變〝!〞)
--help 指令自帶說明

先來說明一下群組密碼,指令 gpasswd 如沒有選項時是設群組密碼,群組密碼其密碼只針對非群組成員的帳碼切換到該群組才需要輸入密碼。例如上例群組〝sub_grp〞其群組成員有〝ccc〞,故此帳號用 newgrp 切換到群組〝sub_grp〞並不會要求輸入密碼。但對非群組成員的帳號要切換到該群組就要輸入密碼。

我們來實測一下吧!

(以 Superuser 登入,續上例)
# gpasswd sub_grp ←為群組〝sub_grp〞設密碼
Changing the password for group sub_grp
New Password: ←輸入要給予的密碼
Re-enter new password: ←輸入二次密碼確認
# su - aaa ←切換帳號〝aaa〞(找一非〝sub_grp〞這群組成員的帳號測試)
$ newgrp sub_grp ←以帳號〝aaa〞加入群組〝sub_grp〞看可不可加入
Passwd: ←輸入該群組的密碼後就可加入群組〝sub_grp〞

另外如果該群組沒設密碼,或用 gpasswd -R 鎖住群組則非群組成員永遠無法使用該群組。

Superuser 如想偷懶,可為每一群組指定一個帳號為群主管理員,而該群主管理員即可執行 gpaasswd 來管理此一群組(群組管理員不一定要是該群組的群組成員)。

其他範例如下:

例:
# gpasswd -a aaa sub_grp ←將群組〝sub_grp〞加入帳號〝aaa〞
# gpasswd -d aaa sub_grp ←群組〝sub_grp〞刪除帳號〝aaa〞
# gpasswd -r sub_grp ←移除群組〝sub_grp〞密碼
# gpasswd -A aaa sub_grp ←將帳號〝aaa〞設成〝sub_grp〞這群組的群組管理員
# gpasswd -R sub_grp ←鎖住群組〝sub_grp〞(其他人都不能用 newgrp 加入,要解除只能重設密碼)

^ back on top ^

groupmod 修改群組
已建立的的群組,也是可微調的,但 groupmod 最重要的功能應是更改群組名稱,用法如下:

語法:groupmod [-otpiton] [NEW_GROUP][OLD_GROUP]
指令名稱/功能/命令使用者 選項 功能
groupmod/
(group modify)修改群組/
Superuser
-g 修改 GID
-o 和 -g 配合使用,可指定重複的 GID 號碼
-n 更改群組名稱
--help 指令自帶說明

例:
# groupmod -g 800 -o sub_grp ←修改群組〝sub_grp〞的 GID=800
# groupmod -n hr_grp sub_grp ←將群組〝sub_grp〞改名為〝hr_grp〞(新群組名要寫在前)

useradd 建立帳號時,如預設的群組名稱不滿意可用 groupmod -n NEW OLD 來改意預設群組名稱 ,且還會自動把之前所建的檔案的群組名稱改為新的群組名稱。

groupdel 刪除群組
刪除群組指令 groupdel 用法很簡單就 groupdel GROUP,也是只有 superuser 才可執行。

groupdel 只可刪除附加的群組,但不能刪除主群組(primary group)。


^ back on top ^


  1.1 群組協同工作
群組管理的目的是共享資料,一般來說共享的資源有目錄或檔案。

以目錄來說,把某目錄設 Set Group ID Bit 不管誰把檔案丟到此目錄內,該檔案的群組會自動變和目錄的群組相同。

另一個方法為如許多帳號都設同一群組或加入某附加群組,而要分享的目錄或檔案群組的擁有者設共同群組名稱就可共享目錄或檔案(當然檔案或目錄的權限也要設正確)。

改變檔案或目錄的群組擁有者可用 chownchgrp



^ back on top ^