2014-05-11 2 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

가능한 복제본 [C를 사용하는 리눅스 사용자 그룹을 얻는 올바른 방법] (http://stackoverflow.com/questions/22104383/proper-way-to-get-groups-of-a-user-in -linux-using-c) –

답변

3

프로그램이 setuid()을 호출하여 root이 아닌 다른 사용자로 전환하면 프로그램이 사용자를 전환 할 수있는 권한을 포기하여 이후 호출이 실패합니다.

+0

아 .. 이렇게 하는게 좋은 방법이 아닙니다. 알겠습니다. 정말 고마워! –

관련 문제