如何在 OSX 和 Linux 中将组名解析为 gid?

如何在 OSX 和 Linux 中将组名解析为 gid?

是否有一段[短]代码可以将符号组名称(例如staff)转换为数字组号(例如82)?

代码在 OS X 和 GNU/Linux 上的运行方式应该相同。

答案1

使用Python的grp模块是足够简单。作为初学者的核心思想:

import grp
print(grp.getgrnam("my_group_name").gr_gid)

然而,一个更强大的解决方案花了我更长的时间:

echo $MYGROUPNAME | python -c 'import grp,sys; gn=sys.stdin.readline().strip(); [gid]=[g.gr_gid for g in grp.getgrall() if g.gr_name==gn][:1]; print(gid)'

首先,它是为两者都工作而编写的蟒蛇2和蟒蛇3

第二:它不使用grp.getgrnam(),但会获取所有组并进行自己的过滤。为什么?因为getgrnam()在我测试过的至少一台 Mac 上根本无法工作。

第三:它截断多个结果。为什么?因为grp.getgrall()在我测试的至少一台 Gentoo 上返回了重复项。

最后:是的,不存在的组会抛出回溯。根据您自己的需要进行调整。


注意 这个问题提供了一些位,但它已被关闭,不接受新的答案并且无法迁移。所以在这里你有一个自我答案。

答案2

接听特登的评论:

Linux(Debian 12,书呆子):

bookworm$ export mygroupname=staff
bookworm$ awk -F: -v group=${mygroupname} '$1==group{print $3}' /etc/group
50

MacOS 索诺玛 14.4:

sonoma$ export mygroupname=staff
sonoma$ awk -F: -v group=${mygroupname} '$1==group{print $3}' /etc/group
20

请注意,通常不鼓励使用大写变量名称,以避免与系统范围标识符发生潜在冲突。

另请注意,如果该组不存在,这不会出错。

相关内容