Слайд 1ОП.14
Основы функционирования UNIX - систем
занятие 10
Слайд 2Программное управление учетными записями
Управление учетными записями пользователей в операционной системе
UNIX возможно как с помощью инструментов командной строки, так и
с использованием интерфейса API («эй-пи-ай») или библиотечных функций языка С («си»).
В этих случаях пользователи могут реализовать свои, довольно сложные и изощренные алгоритмы управления учетными записями пользователей.
Также пользователи могут получать различного рода информацию, касающуюся учетных записей.
Слайд 3Программное управление учетными записями
В языке С («си») определен набор библиотечных
функций, которые не имеют прямого соответствия в
интерфейсах прикладного программирования (API), но, тем не менее, довольно широко используются при разработке программ для UNIX.
Особое внимание стоит обратить на то, что в С («си») имеется целый ряд библиотечных функций, не определенных в стандарте С («си»).
Тем не менее, эти библиотечные функции С («си») доступны во всех UNIX-системах.
Слайд 4Программное управление учетными записями
В примерах программ мы будем использовать
как системные вызовы UNIX, так и библиотечные функции С («си»).
Программы,
представленные в этом разделе, будут работать во всех наиболее популярных операционных системах (Linux, FreeBSD, Solaris и т. д.).
Компиляцию исходных текстов программ можно выполнить стандартными средствами, входящими в состав UNIX.
Слайд 5Программное управление учетными записями
Например, в операционной системе Linux, равно как
и в других системах, можно использовать популярный пакет g++ компилятора
С («си») со стандартными опциями.
Следующий фрагмент программного кода позволяет отобразить на экране дисплея домашний каталог пользователя, регистрационное имя которого указано в качестве аргумента программы.
Исходный текст программы представлен в листинге программы на следующей странице.
Слайд 6Вывод имени домашнего каталога пользователя
#include
#include
#include
#include
int main(int argc, char* argv[])
{
struct passwd
*pwd;
if (argc != 2)
{
printf("Usage: %s registration name\n",
argv[l]); exit(0);
}
Слайд 7Вывод имени домашнего каталога пользователя
pwd = getpwnam(argv[1]);
if (!pwd)
{
printf("%s is not a valid user
name!\n", argv[l]);
exit(1);
}
printf("Home directory for registration name %s is %s\n", argv[l], pwd->pw dir);
return 0;
}
Слайд 8Программное управление учетными записями
В заголовочном файле
определяется набор функций, предназначенных для получения
информации об учетной записи пользователя.
Эта информация содержится в файле /etc/passwd, и, кроме того, здесь же определена структура passwd.
В поля этой структуры помещается информация из файла /etc/passwd.
Структура passwd имеет формат, представленный на следующей странице:
Слайд 9struct passwd
{
char* pw_name
char* pw_passwd
int
pw_uid
int pw_gid
char*
pw_age
char* pw_comment
char* pw_dir
char* pw_shell
}
Программное управление учетными записями
Слайд 10Поля структуры имеют такой смысл:
• pw_name — регистрационное
имя пользователя;
• pw_passwd — зашифрованный пароль;
•
pw_uid — идентификатор пользователя;
• pw_gid — идентификатор (gid) группы;
• pw_age — минимальный срок действия пароля;
• pw_comment — общая информация о пользователе;
• pw_dir — начальный каталог пользователя;
• pw_shell — регистрационный командный интерпретатор shell.
Программное управление учетными записями
Слайд 11Программное управление учетными записями
В данном примере используется функция getpwnam(), имеющая
синтаксис:
const struct passwd* getpwnam(const char* имя_пользователя)
Здесь
имя_пользователя — регистрационное имя пользователя.
Функция заполняет поля структуры passwd информацией о данной учетной записи.
Слайд 12Программное управление учетными записями
В другом примере приведен исходный текст программы,
которая выводит на экран дисплея регистрационное имя пользователя и путь
к регистрационному командному интерпретатору.
Имя и путь выводятся при заданном значении идентификатора uid пользователя, который является единственным параметром программы.
Листинг программы приведён на следующей странице.
Слайд 13Вывод имени пользователя и пути к интерпретатору shell
int main(int argc,
char* argv[])
{
struct passwd *pwd;
int uid;
if (argc !=
2)
{
printf("Usage: %s uid\n", argv[0]);
exit(0);
}
uid = atoi(argv[l]);
Слайд 14Вывод имени пользователя и пути к интерпретатору shell
pwd =
getpwuid(uid);
if (!pwd)
{
printf("%s is not a valid
user UID!\n",argv[l]);
exit(1);
}
printf("Registration shell for user with uid = %d is: %s\n", pwd->pw uid, pwd->pw shell);
printf("USER_NUME for user with UID = Id is: %s\n", pwd->pw uid, pwd->pw name);
return 0;
}
Слайд 15Программное управление учетными записями
В этой программе используется функция getpwuid (),
синтаксис которой таков:
const struct passwd* getpwuid(const int uid)
В качестве параметра функция принимает значение идентификатора пользователя uid.
Программа, исходный текст которой показан на следующем листинге, выводит на экран дисплея имена и идентификаторы пользователей, записи о которых находятся в файле /etc/passwd.
Слайд 16Вывод регистрационных имен и идентификаторов
всех пользователей
#include
#include
#include
#include
int main(void)
{
struct passwd *pwd;
setpwent();
Слайд 17Вывод регистрационных имен и идентификаторов
всех пользователей
while (pwd =
getpwent())
{
printf("Registration name:%s, uid:%d\n", pwd->pw name,
pwd->pw uid);
}
endpwent();
return 0;
}
Слайд 18Программное управление учетными записями
В этой программе используются
функции setpwent(), getpwent() и endpwent().
Функция setpwent () устанавливает указатель чтения на начало файла /etc/passwd, функция getpwent() смещает указатель на следующую запись файла /etc/passwd, а функция endpwent() закрывает файл /etc/passwd.
Для отображения идентификатора группы, зная ее имя, можно воспользоваться программой, исходный текст которой представлен на следующем листинге. Программа принимает единственный параметр, которым является имя группы.
Слайд 19Отображение идентификатора группы
#include
#include
#include
int main(int
argc, char* argv[])
{
struct group *grp;
if (argc != 2)
{
printf("Usage: %s [group name]\n", argv[0]);
Слайд 20Отображение идентификатора группы
exit(0);
}
grp = getgrnam(argv[1]);
printf("gid = %d for group %s\n", grp->gr gid, grp->gr name);
return 0;
}
Слайд 21Программное управление учетными записями
В файле заголовка определяется набор функций,
предназначенных для получения информации о группах.
Эта
информация содержится в файле /etc/group.
Кроме того, здесь же определена структура group, в поля которой помещается информация из файла /etc/group.
Структура group имеет формат, представленный на следующей странице:
Слайд 22Программное управление учетными записями
struct group
{
char* gr_name
char* gr_passwd
int gr_gid
char*
pw_comment
}
Слайд 23Программное управление учетными записями
Здесь:
• gr_name — имя
группы;
• gr_passwd — зашифрованный пароль группы;
• gr_gid — идентификатор группы gid;
• pw_comment — имена членов группы.
Функция getgrnam() принимает в качестве аргумента имя группы и возвращает указатель на запись типа struct group, которая содержит информацию о группе, если группа определена в системе.
Слайд 24Программное управление учетными записями
В последнем примере, представленном на
следующем листинге, показан исходный текст
программы, которая отображает на экране дисплея:
• имя группы;
• ее идентификатор.
Эта информация содержится в файле /etc/group.
Слайд 25Вывод имени группы и ее идентификатора
на экран
#include
#include
#include
int main(void)
{
struct group *grp;
setgrent();
Слайд 26Вывод имени группы и ее идентификатора
на экран
while (grp = getgrent())
{
printf("Group
name : %s, gid: %d\n", grp->gr name, grp->gr gid);
}
endgrent();
return 0;
}
Слайд 27Программное управление учетными записями
В этой программе определённые функции выполняют следующие
действия.
Функция setgrent() устанавливает указатель чтения файла на начало файла
/etc/group.
Функция getgrent() смещает на следующую запись файла /etc/group.
Функция endgrent() закрывает файл /etc/group.
Слайд 28Программное управление учетными записями
Рассмотренные примеры демонстрируют только
небольшую часть тех возможностей, которые
предоставляет операционная система для создания собственных алгоритмов управления учетными записями пользователей и получения различного рода информации о пользователях.
В состав библиотечных функций С («си») включена группа функций, предназначенных для шифрования и дешифрования данных.
Функции этой группы очень важны, поскольку позволяют обеспечить безопасность системы.
Слайд 29Программное управление учетными записями
Так, например, файлы пользовательских паролей и
системных данных, которым необходима высокая степень защиты, обычно должны
храниться в зашифрованном виде.
Файл заголовка crypt.h определяет несколько функций шифрования/дешифрования — crypt(), setkey() и encrypt().
Функция crypt() используется в UNIX-системах для шифрования пользовательских паролей и проверки действительности пароля пользователя.
Слайд 30Программное управление учетными записями
Функции setkey() и encrypt()
выполняют действия, аналогичные тем, которые выполняет функция crypt().
Разница лишь
в том, что в этих функциях используется алгоритм шифрования данных по другому стандарту (DES).
Этот стандарт более надежен, чем тот, что используется функцией crypt().
Слайд 31Вспомним некоторые команды
При использовании команды ls -l, для файла /bin/sh:
$ ls -l /bin/sh
был получен следующий результат:
-rwxr-x--x 1
root bin 87924 Sep 21 2005 /bin/sh
Проанализируем полученный результат.
Здесь в первом поле задается тип файла и маска режима доступа к нему: поскольку первым символом является дефис, то это обычный файл.
Слайд 32Вспомним некоторые команды
Обозначение типов файлов в выводе команды ls -l
Слайд 33Вспомним некоторые команды
Следующие за дефисом девять символов
первого поля представляют триады битов режима,
обозначенные литерами r, w и х (чтение, запись и выполнение соответственно).
Для данного примера владелец обладает полным доступом к файлу (rwx).
Пользователи группы bin — правом на чтение и выполнение (r-x).
Остальные пользователи могут только выполнить этот файл (--x).
Слайд 34Вспомним некоторые команды
Для копирования одного каталога в другой можно выполнить
команду:
# ср -r DIR DIR.OLD
Здесь каталог DIR вместе
со своим содержимым копируется в каталог DIR.OLD.
# ср -r DIR1 DIR2 DIR.OLD
Здесь каталог DIR1 и DIR2 вместе со своим содержимым копируется в каталог DIR.OLD.
Слайд 35Вспомним некоторые команды
Перемещение файлов в операционной системе UNIX выполняется с
помощью команды mv, имеющей синтаксис:
mv [опции...] исходный_файл файл_назначения
mv [опции...] исходный_файл... каталог
Вот пример использования команды mv:
# mv test test.old
Здесь файл test переименовывается в файл test.old.
Слайд 36Вспомним некоторые команды
Если последний параметр команды
указывает на имя существующего каталога, то
mv перемещает указанные файлы в этот каталог.
В том случае, если в качестве параметров заданы имена двух файлов, то имя первого файла будет изменено на имя второго.
Если же последний параметр не является каталогом, и заданы имена более чем двух файлов, то команда генерирует ошибку.
Слайд 37Контрольные вопросы
1. При выполнении команды ls -l для файла /usr/data:
$
ls -l /usr/data
был получен следующий результат:
drw-r----x 1
user1 usr 32544 Dec 16 2015 /usr/data
Что может означать эта запись?
Слайд 38Контрольные вопросы
1. При выполнении команды ls -l для файла /usr/data:
$
ls -l /usr/data
был получен следующий результат:
-rwxr-xr-- 2
user1 user2 usr 62234 Dec 02 2018 /usr/data
Что может означать эта запись?
Слайд 39Контрольные вопросы
1. При выполнении команды ls -l для файла /usr/data/text1:
$
ls -l /usr/data/text1
был получен следующий результат:
--w-r----x 3
user1 user2 user3 usr 56128 Dec 28 2014 /usr/data/text1
Что может означать эта запись?
Слайд 40Контрольные вопросы
2. Выполните команду копирования каталога BUH в каталог USR5.
2.
Выполните команду копирования каталога SLV в каталог DIR.
2. Выполните команду
копирования каталога DIR2 в каталог ALX.
2. Выполните команду копирования каталога USL и RTX в каталог DIR3.
2. Выполните команду копирования каталога UVS и RST в каталог SLC.
2. Выполните команду копирования каталога CTS и DIR3 в каталог SLV2.
Слайд 41Контрольные вопросы
3. Переименовать файл data2 в файл old12.
3. Переименовать
файл text0 в файл text3.
3. Переименовать файл adata
в файл old01.
3. Переименовать файл data3 в файл test.
3. Переименовать файл test6 в файл old.
3. Переименовать файл data2 в файл old5.
Слайд 42Контрольные вопросы
4. Переместить файл data в каталог DIR2.
4. Переместить
файл text в каталог BUH.
4. Переместить файл test
в каталог OLD.
4. Переместить файл data в каталог USR.
4. Переместить файл text2 в каталог LIB.
4. Переместить файл text4 в каталог DIR.
Слайд 43Список литературы:
Юрий Магда. UNIX для студентов, Санкт-Петербург «БХВ-Петербург», 2007.
Unix и
Linux: руководство системного администратора, 4-е издание, 2012, Э. Немет, Г.
Снайдер, Т. Хейн, Б. Уэйли
Организация UNIX систем и ОС Solaris 9, Торчинский Ф.И., Ильин Е.С., 2-е издание, исправленное, 2016.
Слайд 44Спасибо за внимание!
Преподаватель: Солодухин Андрей Геннадьевич
Электронная почта: asoloduhin@kait20.ru