Основы программирования в Linux
Поскольку UID — это ключевой параметр для идентификации пользователя, начнем с него.
У UID есть свои тип
, определенный в файле sys/types.h. Обычно это короткое целое (small integer). Одни идентификаторы пользователя заранее определены системой, другие создаются системным администратором, когда новые пользователи становятся известны системе. Как правило, идентификаторы пользователей имеют значения, большие 100.uid_t<b>#include <sys/types.h></b><b>#include <unistd.h></b><b>uid_t getuid (void);</b><b>char *getlogin(void);</b>Функция
возвращает UID, с которым связана программа. Обычно это UID пользователя, запустившего программу.getuidФункция
возвращает регистрационное имя, ассоциированное с текущим пользователем.getloginСистемный файл /etc/passwd содержит базу данных, имеющую дело с учетными записями пользователей. Он состоит из строк по одной на каждого пользователя, в каждую строку включены имя пользователя, зашифрованный пароль, идентификатор пользователя (UID), идентификатор группы (GID), полное имя, исходный каталог и командная оболочка, запускаемая по умолчанию. Далее приведен пример такой строки:
neil:zBqxfqedfpk:500:100:Neil Matthew:/home/neil:/bin/bashЕсли вы пишете программу, которая определяет UID пользователя, запустившего ее, то можете расширить ее возможности и заглянуть в файл passwd для выяснения регистрационного имени пользователя и его полного имени. Мы не рекомендуем делать это, потому что современные UNIX-подобные системы уходят от применения файлов учетных записей пользователей для повышения безопасности системы. Многие системы, включая Linux, имеют возможность использовать файлы теневых паролей (shadow password), совсем не содержащие пригодной информации о зашифрованных паролях (она часто хранится в файле /etc/shadow, которые обычные пользователи не могут читать). По этой причине определен ряд функций для предоставления эффективного программного интерфейса, позволяющего получать эту пользовательскую информацию.
<b>#include <sys/types.h></b><b>#include <pwd.h></b><b>struct passwd *getpwuid(uid_t uid);</b><b>struct passwd *getpwnam(const char *name);</b>Структура базы данных учетных записей пользователей
определена в файле pwd.h и включает элементы, перечисленные в табл. 4.4.passwdТаблица 4.4
Элемент passwdОписание char *pw_nameРегистрационное имя пользователя uid_t pw_uidНомер UID gid_t pw_gidНомер GID char *pw_dirИсходный каталог пользователя char *pw_gecosПолное имя пользователя char *pw_shellКомандная оболочка пользователя, запускаемая по умолчанию В некоторых системах UNIX может использоваться другое имя для поля с полным именем пользователя: в одних системах это
, как в ОС Linux, в других —pw_gecos. Это означает, что мы не можем рекомендовать его использование. Обе функции (иpw_comment, иgetpwuid) возвращают указатель на структуруgetpwnam, соответствующую пользователю. Пользователь идентифицируется по UID в функцииpasswdи по регистрационному имени в функции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:
$ <b>./user</b>User is neilUser IDs: uid=1000, gid=100UID passwd entry:name=neil, uid=1000, gid=100, home=/home/neil, shell=/bin/bashroot passwd entry:name=root, uid=0, gid=0, home=/root, shell=/bin/bashКак это работает
Эта программа вызывает функцию
для получения UID текущего пользователя, Этот UID применяется в функцииgetuidдля получения подробной информации из файла учетных записей пользователей. В качестве альтернативы мы показываем, как для извлечения информации о пользователе можно задать в функцииgetpwuidимя пользователяgetpwnam.root