[Linux/Python] 將一個用戶加入多個 supplementary group 群組中
最近在做 Linux 上的 runas 程式,這才被提醒一個用戶可以是屬於多個群組,
除了 gid 指的是主要群組 (primary group),其他的郡組則是叫 supplementary groups~
參考資料:superuser: How do I add a user to multiple groups in Ubuntu?
在 Linux 上,建立一個 user 很簡單,用 useradd 就行了:
testuser@localhost ~ $ sudo useradd testuser2
可以用 groups 指令看看這個新建的用戶是屬於什麼群組,
預設狀況下會建立一個跟用戶名一樣的群組:
testuser@localhost ~ $ groups testuser2
testuser2 : testuser2
下面做個測試,用 testuser 建立一個只有這個 user/group 可以讀取的檔案,
自然 testuser 自己是可以讀取內容的:
testuser@localhost ~ $ echo "You have permission to see this file" > /tmp/file_testuser testuser@localhost ~ $ chmod 660 /tmp/file_testuser testuser@localhost ~ $ cat /tmp/file_testuser You have permission to see this file
試試用 testuser2 的身份來讀取,因為不屬於 testuser 的群組,所以無法讀取:
testuser2@localhost ~ $ cat /tmp/file_testuser
cat: /tmp/file_testuser: Permission denied
我們可以用 usermod 這個指令,將 testuser2 也加入 testuser 這個群組內,
這時 groups 指令會秀出 testuser2 這個用戶目前是屬於 testuser2 和 testuser 兩個群組:
testuser@localhost ~ $ sudo usermod -a -G testuser testuser2 testuser@localhost ~ $ groups testuser2 testuser2 : testuser2 testuser
這時 testuser2 用戶就可以看到 file_testuser 的檔案內容了,
因為 testuser2 目前屬於 testuser 群組,而這檔案是允許 testuser 群組讀取的:
testuser2@localhost ~ $ cat /tmp/file_testuser
You have permission to see this file
在 python 裡面,可以用 grp.getgrall() 列出所有的群組,
同時可以看有哪些用戶屬於這些群組~
比較特異的是,gr_mem 這個串列有可能會包含這個群組本身,也有可能不包含…
以下例來說,bin 這個群組裡有兩個用戶 bin 和 daemon 被列在 gr_mem 裡面,
但像 testuser 這個群組裡是有 testuser 這個用戶的,但並沒有列在 gr_mem 裡面:
>>> import grp >>> pprint(grp.getgrall()) [grp.struct_group(gr_name='root', gr_passwd='x', gr_gid=0, gr_mem=[]), grp.struct_group(gr_name='bin', gr_passwd='x', gr_gid=1, gr_mem=['bin', 'daemon']), grp.struct_group(gr_name='daemon', gr_passwd='x', gr_gid=2, gr_mem=['bin', 'daemon']), grp.struct_group(gr_name='testuser', gr_passwd='x', gr_gid=501, gr_mem=['testuser2']), grp.struct_group(gr_name='testuser2', gr_passwd='x', gr_gid=503, gr_mem=[])] >>>