如何打印所有本地用户的组?

时间:2016-02-24 09:01:30

标签: c unix

我想打印存储在/ etc / passwd中的所有用户组。看起来很简单,我可以使用getpwent()和getgrouplist()。我带来了这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>
#include <grp.h>

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

    struct passwd* user;
    int nGroups = 20;
    gid_t* groups;
    groups = malloc(nGroups * sizeof(gid_t));
    struct group* gr;
    while(user = getpwent()){
        printf("%s : ", user->pw_name);
        getgrouplist(user->pw_name, user->pw_gid, groups, &nGroups);
        int i;
        for(i = 0; i < nGroups; ++i){
            gr = getgrgid(groups[i]);
            if(gr){
                printf("%s ", gr->gr_name);
            }  
        }
        printf("\n");
    }

    free(groups);
    return 0;
}

它给了我这个输出:

root : root 
daemon : daemon 
bin : bin 
.
.
.
pulse : pulse root 
ricenwind : ricenwind adm root root root root root root 
vboxadd : daemon 

这显然是错误的,例如使用

groups ricenwind

给了我:

ricenwind : ricenwind adm cdrom sudo dip plugdev lpadmin sambashare

2 个答案:

答案 0 :(得分:1)

如果您阅读the getgrouplist manual page,您会看到

  

阵列*ngroups中最多返回groups个这些组。

ngroups参数不仅由函数设置,它还被函数用来知道为groups参数分配了多少结构。

你需要&#34;重置&#34;调用nGroups之前的getgrouplist变量,否则将使用上次调用该函数设置的旧值:

nGroups = 20;
getgrouplist(user->pw_name, user->pw_gid, groups, &nGroups);

答案 1 :(得分:0)

您可以使用简单的bash脚本

来实现此目的

!/斌/庆典

grep“/ bin / bash”/ etc / passwd

它会做结果,bcoz所有本地用户都将/ bin / bash或/ bin / sh作为他们的shell