Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_Intro0(1).pdf
Скачиваний:
18
Добавлен:
11.02.2016
Размер:
487.54 Кб
Скачать

#include <pwd.h> #include <shadow.h>

int main(int argc,int *argv){ struct passwd *userinfo; struct spwd *passw; uid_t userid;

if (argc<2) {

printf("Try to use: %s uin password\n",argv[0]); return 1;

};

userid = (uid_t)atoi(argv[1]); userinfo = getpwuid(userid);

if (userinfo != NULL){

passw = getspnam(userinfo->pw_name); if (passw != NULL){

printf("Try to test password for \"%s\": ",userinfo->pw_name);

if (strcmp(passw->sp_pwdp,crypt(argv[2],passw->sp_pwdp))==0) printf ("Ok...\n");

else

printf ("Failed...\n");

} else

printf("Can't find password for user with UIN = %s\n",argv[1]);

} else

printf("Can't find user with UIN = %s\n",argv[1]);

return 0; };

Теперь компилируем и запускаем: dron~# ./testpasswd

Try to use: ./testpasswd uin password

dron~# ./testpasswd 1000 12345678

Try to test password for "dron": Ok...

dron~# ./testpasswd 1000 1234

Try to test password for "dron": Failed...

Помоему мы научились проверять правильность паролей для пользователей :) Только не забывайте про то, что пароли из /etc/shadow доступны только из под root, но об этом мы не однократно говорили раньше.

И еще я все время пытаюсь Вам привить то, что исходники не только для того, чтобы их компилировать. Они нужны для того, чтобы изучать программирование и мы будем продолжать их просматривать :) Мало ли может глюки найдем %)

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]