Python:如何获取一个用户名的组ID(如id -Gn)

Ade*_* YU 20 python linux

getpwname只能得到gid一个username.

import pwd
myGroupId = pwd.getpwnam(username).pw_gid
Run Code Online (Sandbox Code Playgroud)

getgroups只能获取groups脚本用户.

import os
myGroupIds = os.getgroups()
Run Code Online (Sandbox Code Playgroud)

我怎么能得到所有groups的任意一个username,比如id -Gn命令?

id -Gn `whoami`
Run Code Online (Sandbox Code Playgroud)

Gar*_*oyd 27

#!/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
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于在系统本地找到用户的情况,而不是在使用例如由ldap支持的sssd时 (4认同)

Jen*_*man 9

当用户非系统本地用户(例如 ldap、sssd+ldap、freeIPA)而不在子进程中调用 id 时,我发现使此功能正常工作的唯一方法是调用 c 函数(getgrouplist最终在进入低谷后由 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)
Run Code Online (Sandbox Code Playgroud)


cs_*_*nus 6

如果您想要当前用户的组。

import os, grp
[grp.getgrgid(g).gr_name for g in os.getgroups()]
Run Code Online (Sandbox Code Playgroud)

os.getgroups() 返回当前用户的 gid 列表。

grp.getgrgid(g) 返回有关组的详细信息

  • 这是最好、最简洁的答案 (2认同)