0

我想通过 NSS 发送请求来获取用户的补充组列表。据我估计,以下程序应该让我枚举所有组(这样我就可以比较成员):

#include <stdio.h>
#include <grp.h>
#include <stdlib.h>

struct group *groupStruct;

int main(){

        setgrent();

        while ( groupStruct=getgrent() )
           printf("%s\n", groupStruct->gr_name);

        endgrent();

        return 0;
}

我将这个假设建立在id执行的源代码的这一部分id -Gn(因为这是我想要复制的功能)。看起来它似乎通过getugroups (0, NULL, username, gid)getugroups()另一个文件中定义(基本上与此处找到的相同代码)来获取组列表。看起来这正在经历与上面相同的 setgrent()/getgrent() 过程,所以我的感觉是我的简单程序应该枚举系统的组(相反,它只做组,/etc/group但我在这台机器上有 winbind并id -Gn拉入用户所属的 winbind 组)。

4

1 回答 1

1

为后代:

我仍然不知道为什么id -Gn代码有效但不是我的,但我想我经过多次来回解决了自己的问题。基本上,我正在构建一个共享对象并通过一个帮助程序枚举他们当前的成员资格,该程序使用initgroups/getgroups将正在运行的进程(辅助程序可执行文件)角色设置为目标用户的默认角色(登录后他们会得到什么。这是帮助程序的完整代码:

#include <stdio.h>
#include <unistd.h>

struct group *groupStruct;

int main(int argc, char *argv[]){

        int numgroups, iter, retCode;
        int numgroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
        gid_t groupList[numgroups_max];

        if (argc != 2){
                printf("Insufficient Arguments.\n");
                return 1;
        }

        retCode=initgroups(argv[1], 0);

        if (retCode != 0){
                printf("Unspecified failure: %d\n\n", retCode);
                return 1;
        }

        numgroups = getgroups(numgroups_max, groupList);

        for (iter=0; iter <= numgroups; iter++){

                if (iter != 0 &&  iter != numgroups )
                        printf(" ");

                  // "zero" means both "nothing more" and could be the root user's primary group, allow the first one through
                if ( groupList[iter] == 0 && getuid() == 0 ){
                        if ( iter != 0 )
                                break;

                }else if ( groupList[iter] == 0 )
                        break;


                printf("%d", groupList[iter]);

        }

        return 0;
}

用户名是硬编码的,仅用于测试目的。编译和测试后,它会为用户生成组 ID。更改硬编码值(或将其推入 argv)可以解决问题。我将它推送到一个辅助可执行文件中,因为它正在改变正在运行的进程的角色(至少是组成员身份部分)。

我可能会将它移到库的调用例程中以提高性能/安全性(我可以使用 and 保存补充组和主要组getgroupssetgroups,但在单独的可执行文件中进行概念验证对我来说更快。

于 2013-05-24T19:13:30.730 回答