Читать интересную книгу Основы программирования в Linux - Мэтью Нейл

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 69 70 71 72 73 74 75 76 77 ... 324

Поскольку UID — это ключевой параметр для идентификации пользователя, начнем с него.

У UID есть свои тип uid_t, определенный в файле sys/types.h. Обычно это короткое целое (small integer). Одни идентификаторы пользователя заранее определены системой, другие создаются системным администратором, когда новые пользователи становятся известны системе. Как правило, идентификаторы пользователей имеют значения, большие 100.

<b>#include &lt;sys/types.h&gt;</b>

<b>#include &lt;unistd.h&gt;</b>

<b>uid_t getuid (void);</b>

<b>char *getlogin(void);</b>

Функция getuid возвращает UID, с которым связана программа. Обычно это UID пользователя, запустившего программу.

Функция 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 &lt;sys/types.h&gt;</b>

<b>#include &lt;pwd.h&gt;</b>

<b>struct passwd *getpwuid(uid_t uid);</b>

<b>struct passwd *getpwnam(const char *name);</b>

Структура базы данных учетных записей пользователей passwd определена в файле pwd.h и включает элементы, перечисленные в табл. 4.4.

Таблица 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, как в ОС Linux, в других — pw_comment. Это означает, что мы не можем рекомендовать его использование. Обе функции (и getpwuid, и getpwnam) возвращают указатель на структуру passwd, соответствующую пользователю. Пользователь идентифицируется по UID в функции getpwuid и по регистрационному имени в функции getpwnam. В случае ошибки обе функции вернут пустой указатель и установят переменную errno.

Выполните упражнение 4.11.

Упражнение 4.11. Информации о пользователе

В этом упражнении показана программа user.c, извлекающая некоторую информацию о пользователе из базы данных учетных записей.

#include &lt;sys/types.h&gt;

#include &lt;pwd.h&gt;

#include &lt;stdio.h&gt;

#include &lt;unistd.h&gt;

#include &lt;stdlib.h&gt;

int main() {

 uid_t uid;

 gid_t gid;

 struct passwd *pw;

 uid = getuid();

 gid = getgid();

 printf(&quot;User is %sn&quot;, getlogin());

 printf(&quot;User IDs: uid=%d, gid=%dn&quot;, uid, gid);

 pw = getpwuid(uid);

 printf(

  &quot;UID passwd entry:n name=%s, uid=%d, gid=%d, home=%s, shell=%sn&quot;,

  pw-&gt;pw_name, pw-&gt;pw_uid, pw-&gt;pw_gid, pw-&gt;pw_dir, pw-&gt;pw_shell);

 pw = getpwnam(&quot;root&quot;);

 printf(&quot;root passwd entry:n&quot;);

 printf(&quot;name=%s, uid=%d, gid=%d, home=%s, shell=%sn&quot;,

  pw-&gt;pw_name, pw-&gt;pw_uid, pw-&gt;pw_gid, pw-&gt;pw_dir, pw-&gt;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 для получения UID текущего пользователя, Этот UID применяется в функции getpwuid для получения подробной информации из файла учетных записей пользователей. В качестве альтернативы мы показываем, как для извлечения информации о пользователе можно задать в функции getpwnam имя пользователя root.

1 ... 69 70 71 72 73 74 75 76 77 ... 324
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Основы программирования в Linux - Мэтью Нейл.

Оставить комментарий