Хрестоматия по программированию на Си в Unix


На www.marketmedia.ru сколько всего торговых центров в москве. | Комьюнити менеджер ieo по материалам www.worgi.ru. |

Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 9


#include <pwd.h>

struct passwd *p; int uid; /* номер */ char *uname; /* рег. имя */

uid = getuid(); p = getpwuid( uid ); ... p = getpwnam( uname );

Эти функции возвращают указатели на статические структуры, скрытые внутри этих функций. Структуры эти имеют поля:

p->pw_uid идентиф. пользователя (int uid); p->pw_gid идентиф. группы пользователя;

и ряд полей типа char[] p->pw_name регистрационное имя пользователя (uname); p->pw_dir полное имя домашнего каталога (каталога, становящегося текущим при входе в систему); p->pw_shell интерпретатор команд (если "", то имеется в виду /bin/sh); p->pw_comment произвольная учетная информация (не используется); p->pw_gecos произвольная учетная информация (обычно ФИО); p->pw_passwd зашифрованный пароль для входа в систему. Истинный пароль нигде не хранится вовсе!

Функции возвращают значение p==NULL, если указанный пользователь не существует (например, если задан неверный uid). uid хозяина данного процесса можно узнать вызовом getuid, а uid владельца файла - из поля st_uid структуры, заполняемой системным вызовом stat (а идентификатор группы владельца - из поля st_gid). Задание: модифицируйте наш аналог программы ls, чтобы он выдавал в текстовом виде имя владельца каждого файла в каталоге.

6.8.2. Владелец файла может изменить своему файлу идентификаторы владельца и группы вызовом

chown(char *имяФайла, int uid, int gid);

т.е. "подарить" файл другому пользователю. Забрать чужой файл себе невозможно. При этой операции биты S_ISUID и S_ISGID в кодах доступа к файлу (см. ниже) сбрасываются, поэтому создать "Троянского коня" и, сделав его хозяином суперпользователя, получить неограниченные привелегии - не удастся!

6.8.3. Каждый файл имеет своего владельца (поле di_uid в I-узле на диске или поле i_uid в копии I-узла в памяти ядра А. Богатырев, 1992-95 Си в UNIX). Каждый процесс также имеет своего владельца (поля u_uid и u_ruid в u-area). Как мы видим, процесс имеет два параметра, обозначающие владельца. Поле ruid называется "реальным идентификатором" пользователя, а uid "эффективным идентификатором". При вызове exec() заменяется программа, выполняемая данным процессом:




Содержание  Назад  Вперед