getpwname
只能获取一个 username
的 gid
。
import pwd
myGroupId = pwd.getpwnam(username).pw_gid
getgroups
只能获取脚本用户的 groups
。
import os
myGroupIds = os.getgroups()
如何获取任意用户名
的所有组
,就像id -Gn
命令一样?
id -Gn `whoami`
getpwname
只能获取一个 username
的 gid
。
import pwd
myGroupId = pwd.getpwnam(username).pw_gid
getgroups
只能获取脚本用户的 groups
。
import os
myGroupIds = os.getgroups()
如何获取任意用户名
的所有组
,就像id -Gn
命令一样?
id -Gn `whoami`
以下内容适用于仅关注本地用户的情况,对于使用目录服务器(例如ldap
)支持的sssd
等内容不起作用。
#!/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
gid
在前面的语句中没有列在groups
中,或者为什么user not in grp.getgrgid(pwd.getpwnam(user).pw_gid).gr_name
。很抱歉,我现在还没有足够的声望来投票支持你。 - Ade YUgrp
和pwd
是库模块,用于帮助解析/etc/group
和/etc/passwd
。因此,生成给出groups
的行是通过遍历/etc/group
列表生成的。gid
是用户的主要组ID,由/etc/passwd
给出,然后使用该gid
查找组名并将其添加到列表中。 - Gareth A. Lloyduser
没有列在它的主要组的 gr_mem
中。 - Ade YUimport os, grp
[grp.getgrgid(g).gr_name for g in os.getgroups()]
os.getgroups()
返回当前用户的gid列表。
grp.getgrgid(g)
返回有关组的详细信息。
sssd
一起使用,但出于某些原因无法用于PAM
会话。仍然是一个不错的选择。 - Torxed我发现在系统中有非本地用户(例如ldap、sssd+ldap、freeIPA)时,让它正常工作的唯一方法是调用getgrouplist
c函数(最终通过一些抽象调用id函数):
#!/usr/bin/python
import grp, pwd, os
from ctypes import *
from ctypes.util import find_library
libc = cdll.LoadLibrary(find_library('libc'))
getgrouplist = libc.getgrouplist
# 50 groups should be enough, if not, we'll repeat the request with the correct nr bellow
ngroups = 50
getgrouplist.argtypes = [c_char_p, c_uint, POINTER(c_uint * ngroups), POINTER(c_int)]
getgrouplist.restype = c_int32
grouplist = (c_uint * ngroups)()
ngrouplist = c_int(ngroups)
user = pwd.getpwuid(2540485)
ct = getgrouplist(bytes(user.pw_name, 'UTF-8'), user.pw_gid, byref(grouplist), byref(ngrouplist))
# if 50 groups was not enough this will be -1, try again
# luckily the last call put the correct number of groups in ngrouplist
if ct < 0:
getgrouplist.argtypes = [c_char_p, c_uint, POINTER(c_uint *int(ngrouplist.value)), POINTER(c_int)]
grouplist = (c_uint * int(ngrouplist.value))()
ct = getgrouplist(user.pw_name, user.pw_gid, byref(grouplist), byref(ngrouplist))
for i in range(0, ct):
gid = grouplist[i]
print(grp.getgrgid(gid).gr_name)
getgrouplist
应该将字节字符串作为其第一个参数,如下所示:getgrouplist(bytes(user.pw_name, 'UTF-8'), ...)
。显然,在Python3中,xrange
也是range
。但这清除了从Python2到Python3的任何转换问题。 - Torxedid -Gn
命令时的结果可能与发布的答案不同。例如,如果/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]
print(*set(getgroups('user_name')))
。请注意,在某些系统中,同一组可能会出现多次。对set
的调用将进行过滤。 - Walker Hale IVimport os
import pwd
uid = os.getuid()
user = pwd.getpwuid(uid)
gl = os.getgrouplist(user.pw_name, user.pw_gid)
print(gl)