2012-02-17 108 views
11

getpwname只能得到gidusernamePython:如何獲得一個用戶名的組ID(如ID -Gn)

import pwd 
myGroupId = pwd.getpwnam(username).pw_gid 

getgroups只能拿到劇本用戶的groups

import os 
myGroupIds = os.getgroups() 

我怎樣才能得到一個任意username的所有groups,像id -Gn命令?

id -Gn `whoami` 
+0

至少我可以使用 從子進口check_output mygroups = check_output([ 'ID', '-Gn',用戶])。分裂() – 2012-02-17 06:34:57

回答

22

#!/usr/bin/env python 

import grp, pwd 

user = "myname" 
groups = [g.gr_name for g in grp.getgrall() if user in g.gr_mem] 
gid = pwd.getpwnam(user).pw_gid 
groups.append(grp.getgrgid(gid).gr_name) 
print groups 
+0

非常感謝。 @加雷思-A-勞埃德。有用。但我不明白爲什麼'gid'沒有在前面的語句中的groups中列出,或者爲什麼'user不在grp.getgrgid(pwd.getpwnam(user).pw_gid).gr_name'中。抱歉,我沒有足夠的聲望來投票給你。 – 2012-02-20 03:54:09

+0

'grp'和'pwd'是庫模塊,可以幫助解析'/ etc/group'和'/ etc/passwd'。因此,給出'groups'的行是通過遍歷/ etc/group列表生成的。 'gid'是'/ etc/passwd'給出的用戶的主組ID,這個'gid'然後用來查找組名並將其添加到列表中。 – 2012-02-20 22:40:20

+0

@ gareth-a-lloyd有趣的是'user'沒有列在主組的'gr_mem'中。 – 2012-02-21 07:21:54

3

id -Gn當用戶屬於一個或多個組,其中幾個組名稱映射到相同gid可能不一樣的答案公佈結果。舉例來說,如果/etc/groups與此類似:

% ypcat group | grep mygroup 
mygroup:*:66485:user1,user2,user3,... 
mygroup1:*:66485:user101,user102,user103,... 
mygroup2:*:66485:user201,user202,user203,... 
... 

而且,如果用戶沒有mygroup列出,但在mygroup<n>id -Gn回報mygroup但貼出答案返回mygroup<n>

看來在我的環境中,由於UNIX組可能有成百上千的用戶,這是一種常見的組管理策略,儘管我不確切知道每個組的用戶數限制以及爲什麼id -Gn總是返回mygroup

然而,與下面的代碼我有一個匹配id -Gn:如果你想在當前用戶的組

import pwd, grp  

def getgroups(user): 
    gids = [g.gr_gid for g in grp.getgrall() if user in g.gr_mem] 
    gid = pwd.getpwnam(user).pw_gid 
    gids.append(grp.getgrgid(gid).gr_gid) 
    return [grp.getgrgid(gid).gr_name for gid in gids] 
3

import os, grp 
[grp.getgrgid(g).gr_name for g in os.getgroups()] 

os.getgroups()返回當前用戶的gid列表。

grp.getgrgid(克)返回關於一組細節

+1

這是最好和最簡潔的答案 – cdjc 2017-02-28 03:01:01