2012-02-17 112 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

相关问题