C setgid():不允许操作

C setgid():不允许操作,c,unix,C,Unix,我的任务是为系统上的所有用户列出用户所属的所有组。其想法是通过/etc/passwd为每个用户打印其组 [编辑]这成功了: if( getgrouplist(passwd->pw_name, passwd->pw_gid, groups, &ngroups) < 0) error_fatal ("getgrouplist ()"); 代码: while((passwd=getpwent())!=NULL){ uid=pass

我的任务是为系统上的所有用户列出用户所属的所有组。其想法是通过
/etc/passwd
为每个用户打印其组

[编辑]这成功了:

if( getgrouplist(passwd->pw_name, passwd->pw_gid,
                    groups, &ngroups) < 0)
  error_fatal ("getgrouplist ()");
代码:

while((passwd=getpwent())!=NULL){
uid=passwd->pw\u uid;
gid=passwd->pw_gid;
if(setgid(gid)<0)
错误_致命(“setgid()”);
if(setuid(uid)<0)
错误\致命(“setuid()”);
if((ngroups=getgroups(0,NULL))<0)
错误\致命(“getgroups()”);
如果((组=(gid_t*)malloc(sizeof(gid_t)*ngroups))<0
致命错误(“malloc()”);
if(getgroups(ngroups,groups)<0)
错误\致命(“getgroups()”);
printf(“用户%s是:”,passwd->pw_name)的成员);
对于(i=0;i组名称);
}
putchar('\n');
}

有什么想法吗?

一旦您的程序调用
setuid()
切换到
root
以外的其他用户,您的程序就放弃了切换用户的权限,因此后续调用将失败。

一旦您的程序调用
setuid()
切换到
root
以外的其他用户,您的程序已放弃切换用户的权限,因此后续调用将失败。

可能重复的可能重复的哦..所以我知道这不是一个好方法。多谢各位!哦……我明白了,这不是一个好办法。多谢各位!
User root is a member of: root
User daemon is a member of: root
setgid(): Operation not permitted
while ((passwd = getpwent ()) != NULL) {
    uid = passwd->pw_uid;
    gid = passwd->pw_gid;

    if (setgid(gid) < 0)
        error_fatal ("setgid()");

    if (setuid(uid) < 0)
        error_fatal ("setuid()");

    if((ngroups = getgroups (0, NULL)) < 0)
        error_fatal ("getgroups ()");

    if((groups = (gid_t *) malloc (sizeof (gid_t) * ngroups)) < 0)
        error_fatal ("malloc ()");

    if (getgroups (ngroups, groups) < 0)
        error_fatal ("getgroups ()");

    printf ("User %s is a member of: ", passwd->pw_name);
    for (i = 0; i < ngroups; i++) {
        gid = groups[i];
        if((group = getgrgid (gid)) == NULL)
            error_fatal ("getgrgid ()");
        printf ("%s ", group->gr_name);
    }
    putchar ('\n');
}