Опросить ассоциированные с пользователем данные (точнее, идентификаторы и имена пользователя и начальной группы, а также всех групп, членами которых ему разрешено быть, - так называемых дополнительных групп) позволяет служебная программа
id [имя_пользователя]
Если имя_пользователя опущено, выдается информация о текущем пользователе и его текущей группе.
Пример использования служебной программы id. Команда
id root
может выдать на стандартный вывод следующий результат:
uid=0(root) gid=0(root) groups=0(root), 1(bin),2(daemon),3(sys),4(adm),6(disk), 10(wheel)
Числовой идентификатор 0 характеризует суперпользователя, который в большинстве Unix-систем не подвержен контролю прав доступа.
Входное имя текущего пользователя можно узнать также с помощью утилиты
logname
и функции getlogin():
#include <unistd.h> char *getlogin (void);
Отметим, что одному идентификатору пользователя может соответствовать несколько записей в базе данных пользователей, различающихся входными именами и, возможно, другими атрибутами; logname и getlogin() выдают имя, под которым начат текущий сеанс работы с ОС.
Над базой данных пользователей определены операции поиска по идентификатору или имени пользователя, реализуемые, соответственно, функциями getpwuid() и getpwnam() (см. пример 3.1):
#include <pwd.h> struct passwd *getpwuid (uid_t uid); #include <pwd.h> struct passwd *getpwnam (const char *name);
Листинг 3.1. Описание функций getpwuid() и getpwnam(). (html, txt)
По стандарту структура passwd должна содержать по крайней мере следующие поля, соответствующие описанным выше обязательным элементам базы данных пользователей:
char *pw_name; /* Имя пользователя */
uid_t pw_uid; /* Числовой идентификатор пользователя */ gid_t pw_gid; /* Числовой идентификатор начальной группы */ char *pw_dir; /* Начальный рабочий каталог */ char *pw_shell; /* Начальная программа пользователя */
Типы uid_t и gid_t определяются в заголовочном файле <sys/types.h>.
Приведем пример выдачи информации о текущем пользователе и пользователе root с идентификатором 0 (см.