Шаг 16 - Получение информации о группах пользователей

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


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей.