Мы с Вами раньше узнали как получать информацию о пользователях, но не секрет, что эти пользователи могут быть объединены в группы. Для разграничения доступа в системе используются оба идентификатора: идентификатор пользователя 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. Далее, если требуется, ему назначаются дополнительные группы, в которые он может входить. После этого в описание этих дополнительных групп добавляется имя этого нового пользователя.