2014-05-11 231 views
0

我的任務是列出系統上所有用戶所屬的用戶所屬的所有組。這個想法是通過/etc/passwd,併爲每個用戶打印其組。setgid():不允許操作

[編輯]這奏效了:

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

但我還是好奇它不工作的原因。

輸出:

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'); 
} 

任何想法?

+0

[正確的方式來獲取用戶在Linux中使用C組]的可能的副本(http://stackoverflow.com/questions/22104383/proper-way-to-get-groups-of-a-user-in -linux-using-c) –

回答

3

一旦程序調用setuid()切換到root以外的其他用戶,您的程序已放棄了切換用戶權限,以便後續調用失敗。

+0

哦,所以這不是一個好辦法,我明白了。萬分感謝! –