2013-02-20 3 views
0

Я искал часы и, похоже, не понял этого. Я знаю, как печатать, помещая текущего пользователя на машину в C, но как распечатать всех пользователей, которые существуют на машине, с помощью C. (Я запускаю Linux-машину). Справа приветствуется! :)Распечатайте всех пользователей машины в C

+1

Вы можете попробовать прочитать из '/ etc/passwd' и распечатать токен перед первым символом ':'. Но это также даст вам пользователей системы и не будет работать для пользователей ldap. – szmoore

ответ

1

На машине UNIX, использовать ряд pwent функций:

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

int main() { 
    struct passwd *p; 
    while((p = getpwent())) { 
     printf("name: %s\n", p->pw_name); 
    } 
} 

Это проконсультируют авторитетную базу данных системы пользователей, которые не обязательно могут быть /etc/passwd.

+0

это работает! благодаря! –

2

Пользователи машины указаны в/etc/passwd. Хорошим способом фильтрации всех «человеческих» пользователей является

cat /etc/passwd | grep "/home" |cut -d: -f1 

Как обычно пользователь имеет домашний каталог.

Теперь, для вызова его внутри C, вы можете использовать popen. Посмотрите на

man popen 
+1

Следует избегать использования 'popen', если для этого есть API. В этом случае 'getpwent/getpwuid' намного проще в использовании. – nneonneo

+0

Я не знал этих команд. Thx nneonneo – Cristopher

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

int main(int argc, char ** argv) 
{ 
    int minUID = 0; 
    int maxUID = 10000; 
    for (int i = minUID; i < maxUID; ++i) 
    { 
     struct passwd * p = getpwuid(i); 
     if (p != NULL) 
      printf("%d : %s\n", i, p->pw_name); 
    } 
} 
0

проверено на BSD.

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

int main(int argc, char** argv) { 
struct passwd *pwd; 

while((pwd = getpwent())!=NULL) { 
printf("%s\n",pwd->pw_name); 

} 
return 0; 
} 
Смежные вопросы