获取用户组ID,然后打印具有相同组ID的用户列表

时间:2017-02-21 12:38:23

标签: c

您好我正在尝试列出具有与您的用户ID匹配的组ID的所有用户名。我当时正在考虑使用getpwent,但似乎无法正确使用似乎得到一个无限循环,我不确定家中只过滤掉具有相同组名的那些。

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


int main(){
 uid_t myId;
 myId = getuid();

 struct passwd *pPwdInfo = NULL;
 pPwdInfo  = getpwuid(myId);

 if((pPwdInfo = getpwuid(myId)) != NULL){
   int gId = pPwdInfo->pw_gid;

   struct passwd *pwd_entry = NULL;
   pwd_entry  = getpwent();

   setpwent(); // go to the top of /etc/passwd

   while(pwd_entry){
    printf("Username: %s\n", pwd_entry->pw_name);
    printf("Password: %s\n", pwd_entry->pw_passwd);
    printf("User Id: %d\n", pwd_entry->pw_uid);
    printf("Group Id: %d\n", pwd_entry->pw_gid);
    printf("User info: %s\n", pwd_entry->pw_gecos);
    printf("Home Directory: %s\n", pwd_entry->pw_dir);
    printf("Shell Program: %s\n", pwd_entry->pw_shell);
   }

   endpwent();
 }else{

 }
 return 0;
}

1 个答案:

答案 0 :(得分:1)

根据手册页

  

getpwent()函数返回指向包含结构的指针   来自密码数据库的记录的分解字段(例如,   本地密码文件/ etc / passwd,NIS和LDAP)。第一次   调用getpwent(),它返回第一个条目;之后,它   返回连续的条目。

所以你忘了先在循环中调用getpwent()

while(pwd_entry){
    if (pwd_entry->pw_gid == uid_you_want_to_match) {
        printf("Username: %s\n", pwd_entry->pw_name);
        printf("Password: %s\n", pwd_entry->pw_passwd);
        printf("User Id: %d\n", pwd_entry->pw_uid);
        printf("Group Id: %d\n", pwd_entry->pw_gid);
        printf("User info: %s\n", pwd_entry->pw_gecos);
        printf("Home Directory: %s\n", pwd_entry->pw_dir);
        printf("Shell Program: %s\n", pwd_entry->pw_shell);
    }
    pwd_entry = getpwent()
}