- •Программирование под Linux
- •Шаг 1 - Компиляция программ на языке C/C++
- •Шаг 2 - Отладочная информация
- •Шаг 10 - Передача опций в программу - getopt
- •Шаг 14 - Получение данных из shadow password
- •Шаг 3 - Компиляция нескольких файлов
- •Шаг 4 - Библиотеки объектных файлов
- •Шаг 5 - Создание статической библиотеки
- •Шаг 6 - Создание динамической библиотеки
- •Шаг 7 - Использование динамических библиотек
- •Шаг 8 - Функции работы с динамическими библиотеками
- •Шаг 9 - Инициализация динамических библиотек
- •Шаг 10 - Передача опций в программу - getopt
- •Шаг 11 - Передача длинных опций в программу - getopt_long
- •Шаг 12 - Вывод сообщений об ошибках программы
- •Шаг 13 - Получение информации о пользователе
- •Шаг 14 - Получение данных из shadow password
- •Шаг 15 - Работа с паролями системы с помощью функции crypt()
- •Шаг 16 - Получение информации о группах пользователей
#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. Далее, если требуется, ему назначаются дополнительные группы, в которые он может входить. После этого в описание этих дополнительных групп добавляется имя этого нового пользователя.