根据组名获取组ID(Python,Unix)

15 投票
3 回答
27452 浏览
提问于 2025-04-15 13:02

我想用Python来获取一个组的ID和对应的组名。

这个程序需要在类Unix操作系统上运行,比如Linux和Mac OS X。

这是我目前找到的内容:

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

3 个回答

-2

使用Perl语言:

$grp_id = getgrnam($ARGV[0]);
print $grp_id."\n";
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_gid

比如,root 的 GID 是 0:

>>> grp.getgrnam('root')
('root', 'x', 0, ['root'])
>>> grp.getgrnam('root')[-2]
0
>>> grp.getgrnam('root').gr_gid
0
>>>
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 模块中,接口也很相似。

撰写回答