macOS 上的 getgroups() 不返回所有补充组,而只返回主要组
getgroups() on macOS is not returning all the supplementary groups, but instead just the primary group
'id' 命令确实给了我所有的补充组,但下面的代码只是返回使用所属的主要组:
gid_size = getgroups(0, NULL); //1 is getting returned here
grouplist = malloc(gid_size * sizeof(gid_t));
getgroups(gid_size, grouplist); //Even with gid_size>1, only primary groups is returned.
我的问题是,是否有任何其他替代方法可以在 macOS 上获取所有补充组。
您应该可以通过先调用 initgroups()
获得多达 16 个以上的组,但即使这样也不理想。
Processes should not use the group ID numbers from getgroups(2)
to determine a user's group membership. The list obtained from getgroups()
may only be a partial list of a user's group membership. Membership checks should use the mbr_gid_to_uuid(3)
, mbr_uid_to_uuid(3)
, and mbr_check_membership(3)
functions.
因此,如果您要检查用户是否是特定组的成员,mbr_*()
函数是最佳选择。
请注意 source code of the id
command is available,根据非常快速的检查,它看起来像是使用了未记录的 getgrouplist_2()
。
它looks like this is a variant of the getgrouplist()
功能,但没有16组限制。
我不认为这个函数在任何 public headers 中声明,id.c
使用原型
int32_t getgrouplist_2(const char *, gid_t, gid_t **);
'id' 命令确实给了我所有的补充组,但下面的代码只是返回使用所属的主要组:
gid_size = getgroups(0, NULL); //1 is getting returned here
grouplist = malloc(gid_size * sizeof(gid_t));
getgroups(gid_size, grouplist); //Even with gid_size>1, only primary groups is returned.
我的问题是,是否有任何其他替代方法可以在 macOS 上获取所有补充组。
您应该可以通过先调用 initgroups()
获得多达 16 个以上的组,但即使这样也不理想。
Processes should not use the group ID numbers from
getgroups(2)
to determine a user's group membership. The list obtained fromgetgroups()
may only be a partial list of a user's group membership. Membership checks should use thembr_gid_to_uuid(3)
,mbr_uid_to_uuid(3)
, andmbr_check_membership(3)
functions.
因此,如果您要检查用户是否是特定组的成员,mbr_*()
函数是最佳选择。
请注意 source code of the id
command is available,根据非常快速的检查,它看起来像是使用了未记录的 getgrouplist_2()
。
它looks like this is a variant of the getgrouplist()
功能,但没有16组限制。
我不认为这个函数在任何 public headers 中声明,id.c
使用原型
int32_t getgrouplist_2(const char *, gid_t, gid_t **);