我想使用Python获取对应组名的组ID。该程序必须适用于类Unix操作系统(Linux和Mac OS X)。
目前我找到了以下内容
>>> import grp
>>> for g in grp.getgrall():
... if g[0] == 'wurzel':
... print g[2]
如果您阅读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提供了类似的功能来获取密码和影子文件的信息,在 pwd 和 spwd 模块中,它们具有相似的API。
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
gr_gid
。
root
的GID为0:>>> grp.getgrnam('root')
('root', 'x', 0, ['root'])
>>> grp.getgrnam('root')[-2]
0
>>> grp.getgrnam('root').gr_gid
0
>>>
$grp_id = getgrnam($ARGV[0]);
print $grp_id."\n";
admin
,admin2
,admin3
等。您可能没有意识到这一点,因为文件是使用其数字UID / GID存储的,并且像ls
这样的工具会查找GID并显示遇到的第一个名称,例如在我的示例中将是admin
。因此,您可能会惊讶地发现某个用户帐户不在admin
组中,而实际上是admin2
或其他别名。您必须按GID过滤所有组以查找别名。 - RobM