[Linux/Python] 將一個用戶加入多個 supplementary group 群組中

[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=[])]
>>>

 

 

 

 

(本頁面已被瀏覽過 493 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料