通过组名获取组ID(Python,Unix)

15

我想使用Python获取对应组名的组ID。该程序必须适用于类Unix操作系统(Linux和Mac OS X)。

目前我找到了以下内容

>>> import grp
>>> for g in grp.getgrall():
...     if g[0] == 'wurzel':
...         print g[2]
3个回答

22

如果您阅读grp模块文档,您将看到grp.getgrnam(groupname)将从组数据库返回一个类似元组的对象。 您可以根据索引或属性访问信息:

>>> import grp
>>> groupinfo = grp.getgrnam('root')
>>> print groupinfo[2]
0
>>> print groupinfo.gr_gid
0

其他条目包括用户名、已加密的密码(通常为空,如果使用影子文件,则为虚拟值)和所有组成员的名称。这在任何Unix系统上都可以正常工作,包括我的Mac OS X笔记本电脑:

>>> import grp
>>> admin = grp.getgrnam('admin')
>>> admin
('admin', '*', 80, ['root', 'admin', 'mj'])
>>> admin.gr_name
'admin'
>>> admin.gr_gid
80
>>> admin.gr_mem
['root', 'admin', 'mj']

该模块还提供了一种按gid获取条目的方法,正如您发现的那样,还有一种在数据库中循环所有条目的方法:

>>> grp.getgrgid(80)
('admin', '*', 80, ['root', 'admin', 'mj'])
>>> len(grp.getgrall())
73

最后但并非最不重要的,Python提供了类似的功能来获取密码和影子文件的信息,在 pwdspwd 模块中,它们具有相似的API。


请注意,由于Unix组的成员数量有限,一些(大型)系统可能会有多个具有相同GID但不同名称的Unix组,例如:adminadmin2admin3等。您可能没有意识到这一点,因为文件是使用其数字UID / GID存储的,并且像ls这样的工具会查找GID并显示遇到的第一个名称,例如在我的示例中将是admin。因此,您可能会惊讶地发现某个用户帐户不在admin组中,而实际上是admin2或其他别名。您必须按GID过滤所有组以查找别名。 - RobM

5

请参阅grp.getgrnam(name)

grp.getgrnam(name)

返回给定组名的组数据库条目。如果找不到所需的条目,则引发KeyError。

组数据库条目被报告为类似元组的对象,其属性对应于组结构的成员:

Index   Attribute   Meaning

0   gr_name     the name of the group
1   gr_passwd   the (encrypted) group password; often empty
2   gr_gid  the numerical group ID
3   gr_mem  all the group member’s user names

数字组ID在索引2处,或者是倒数第二个,或者是属性gr_gidroot的GID为0:
>>> grp.getgrnam('root')
('root', 'x', 0, ['root'])
>>> grp.getgrnam('root')[-2]
0
>>> grp.getgrnam('root').gr_gid
0
>>>

好的。也许你可以在浏览器中滚动到文档顶部。 - gimel

-2
使用 Perl:
$grp_id = getgrnam($ARGV[0]);
print $grp_id."\n";

2
增加更多关于为什么这是一个答案的信息。 - 0xInfection

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接