2017-02-21 13 views
0

こんにちは、あなたのユーザIDに一致するグループIDを持つすべてのユーザ名をリストしようとしています。私はgetpwentを使うことを考えていましたが、それを得るのが難しいように見えました。無限ループを起こすようで、同じグループ名を持つものだけをフィルタリングすることはできません。ユーザグループIDを取得し、同じグループIDを持つユーザのリストを表示

#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

サイドノート:どのような用途がありますか?ユーザーグループがあっても、UIDとGIDの間には相関関係はありません。 – Olaf

答えて

0

manページ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() 
} 
+0

ありがとう –

関連する問題