Мы с Вами раньше узнали как получать информацию о пользователях, но не секрет, что эти пользователи могут быть объединены в группы. Для разграничения доступа в системе используются оба идентификатора: идентификатор пользователя UID и идентификатор группы GID. С помощью совокупности этих идентификаторов можно достаточно гибко настраивать безопасность системы.
Для работы с группами требуется подключить файл grp.h и Вам станут доступны следующие функции:
#include <grp.h> #include <sys/types.h> struct group *getgrnam(const char *name); struct group *getgrgid(gid_t gid);
Функция getgrnam() ищет группу в файле /etc/group с именем name и возвращает указатель на структуру struct group, либо NULL в случае неудачи.
Функция getgrgid() ищет группу по идентификатору и также возвращает стуктуру struct group, либо NULL в случае неудачи. Данная структура имеет следующий вид:
struct group { char *gr_name; /* имя группы */ char *gr_passwd; /* групповой пароль */ gid_t gr_gid; /* идентификатор группы */ char **gr_mem; /* члены группы */ };
Назначение полей думаю не требуют объяснения. Один лишь момент в том, что поле members это массив указателей на строки, в котором для обозначения конца последний элемент равен NULL.
Давайте попробуем написать программку, которая будет выводить информацию о группе:
#include <stdlib.h> #include <grp.h> #include <sys/types.h> int main() { struct group *g= NULL; char **p = NULL; g = getgrnam("webmasters"); if (g != NULL){ printf ("gr_name = \"%s\"\n",g->gr_name); printf ("gr_passwd = \"%s\"\n",g->gr_passwd); printf ("gr_gid = \"%d\"\n",g->gr_gid); printf ("gr_members = "); p = g->gr_mem; while (*p != NULL){ printf ("\"%s\" ", *p); p++; }; printf ("\n"); }; return 0; };
После компиляции и запуска программы мы получим список пользователей системы относящихся к группе webmasters:
dron~# ./a.out gr_name = "webmasters" gr_passwd = "x" gr_gid = "102" gr_members = "dron" "kost" "aneta"
Теперь, если посмотреть содержимое файла /etc/group можно увидеть следующую строку:
webmasters:x:102:dron,kost,aneta
Важно отметить то, что в файле /etc/group совершенно не обязательно должны быть перечислены все пользователи из этой группы. В описании каждой группы добавляются только те пользователи, которые входят в несколько групп пользователей одновременно. Все это задается на этапе создания нового пользователя. В первую очередь ему задается основная группа, к которой он принадлежит, как правило это группа users. Далее, если требуется, ему назначаются дополнительные группы, в которые он может входить. После этого в описание этих дополнительных групп добавляется имя этого нового пользователя.