我想打印存储在/ 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
答案 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