Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Поскольку UID — это ключевой параметр для идентификации пользователя, начнем с него.
У UID есть свои тип
uid_t
<b>#include <sys/types.h></b>
<b>#include <unistd.h></b>
<b>uid_t getuid (void);</b>
<b>char *getlogin(void);</b>
Функция
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>
Структура базы данных учетных записей пользователей
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 может использоваться другое имя для поля с полным именем пользователя: в одних системах это
pw_gecos
pw_comment
getpwuid
getpwnam
passwd
getpwuid
getpwnam
errno
Выполните упражнение 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 %sn", getlogin());
printf("User IDs: uid=%d, gid=%dn", uid, gid);
pw = getpwuid(uid);
printf(
"UID passwd entry:n name=%s, uid=%d, gid=%d, home=%s, shell=%sn",
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=%sn",
pw->pw_name, pw->pw_uid, pw->pw_gid, pw->pw_dir, pw->pw_shell);
exit(0);
}
Программа предоставит следующий вывод, который может слегка отличаться в разных версиях Linux и UNIX:
$ <b>./user</b>
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
getpwuid
getpwnam
root