为后代:
我仍然不知道为什么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 保存补充组和主要组getgroups
)setgroups
,但在单独的可执行文件中进行概念验证对我来说更快。