您好我正在尝试列出具有与您的用户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;
}
答案 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()
}