Ответ 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
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`
#!/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
Результат 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]
Если вам нужны текущие группы пользователей.
import os, grp
[grp.getgrgid(g).gr_name for g in os.getgroups()]
os.getgroups() возвращает список гидов текущего пользователя.
grp.getgrgid(g) возвращает сведения о группе