Шрифт:
В некоторых системах UNIX может использоваться другое имя для поля с полным именем пользователя: в одних системах это
pw_gecos
, как в ОС Linux, в других — pw_comment
. Это означает, что мы не можем рекомендовать его использование. Обе функции (и getpwuid
, и getpwnam
) возвращают указатель на структуру passwd
, соответствующую пользователю. Пользователь идентифицируется по UID в функции getpwuid
и по регистрационному имени в функции getpwnam
. В случае ошибки обе функции вернут пустой указатель и установят переменную errno
. Выполните упражнение 4.11.
Упражнение 4.11. Информации о пользователе
В этом упражнении показана программа user.c, извлекающая некоторую информацию о пользователе из базы данных учетных записей.
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main {
uid_t uid;
gid_t gid;
struct passwd *pw;
uid = getuid;
gid = getgid;
printf("User is %s\n", getlogin);
printf("User IDs: uid=%d, gid=%d\n", uid, gid);
pw = getpwuid(uid);
printf(
"UID passwd entry:\n name=%s, uid=%d, gid=%d, home=%s, shell=%s\n",
pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);
pw = getpwnam("root");
printf("root passwd entry:\n");
printf("name=%s, uid=%d, gid=%d, home=%s, shell=%s\n",
pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);
exit(0);
}
Программа предоставит следующий вывод, который может слегка отличаться в разных версиях Linux и UNIX:
$ ./user
User is neil
User IDs: uid=1000, gid=100
UID passwd entry:
name=neil, uid=1000, gid=100, home=/home/neil, shell=/bin/bash
root passwd entry:
name=root, uid=0, gid=0, home=/root, shell=/bin/bash
Как это работает
Эта программа вызывает функцию
getuid
для получения UID текущего пользователя, Этот UID применяется в функции getpwuid
для получения подробной информации из файла учетных записей пользователей. В качестве альтернативы мы показываем, как для извлечения информации о пользователе можно задать в функции getpwnam
имя пользователя root
. Примечание
В исходном коде Linux вы сможете найти в команде
id
еще один пример-использования функции getuid
. Для просмотра всех данных файла учетных записей пользователей можно воспользоваться функцией
getpwent
. Она последовательно выбирает строки файла.
#include <pwd.h>
#include <sys/types.h>
void endpwent(void);
struct passwd *getpwent(void);
void setpwent(void);
Функция
getpwent
возвращает поочередно информацию о каждом пользователе. Когда не остается ни одного, она возвращает пустой указатель. Для прекращения обработки файла, когда просмотрено достаточно элементов, вы можете применить функцию endpwent
. Функция setpwent
переустанавливает позицию указателя в файле учетных записей пользователей для начала нового просмотра при следующем вызове функции getpwent
. Эти функции действуют так же, как функции просмотра каталога opendir
, readdir
и closedir
, обсуждавшиеся в главе 3. Идентификаторы пользователя и группы (эффективный или действующий и реальный) можно получить с помощью других реже используемых функций:
#include <sys/types.h>
#include <unistd.h>
uid_t geteuid(void);
gid_t getgid(void);
gid_t getegid(void);
int setuid(uid_t uid);