Python: как получить идентификаторы групп одного имени пользователя (например, id -Gn)

getpwname может получить только gid a username.

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

getgroups может получить только groups пользователя script.

import os
myGroupIds = os.getgroups()

Как я могу получить все groups одного произвольного username, как команда id -Gn?

id -Gn `whoami`

Ответ 1

#!/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

Ответ 2

Результат 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() возвращает список гидов текущего пользователя.

grp.getgrgid(g) возвращает сведения о группе