
- •Часть вторая. Подсистема управления файлами
- •Глава 3. Файловый ввод-вывод 2
- •Глава 4. Файлы и каталоги 21
- •Глава 5. Стандартная библиотека ввода-вывода 56
- •Глава 6. Информация о системе и файлы данных 72
- •Глава 3. Файловый ввод-вывод
- •3.1. Введение
- •3.2. Дескрипторы файлов
- •3.3. Функция open
- •3.4. Функция creat
- •3.5. Функция close
- •3.6. Функция lseek
- •3.7. Функция read
- •3.8. Функция write
- •3.9. Совместное использование файлов
- •3.10. Атомарные операции
- •3.11. Функции dup и dup2
- •3.12. Функции sync, fsync и fdatasync
- •3.13. Функция fcntl
- •3.14. Функция ioctl
- •3.15. Каталог /dev/fd
- •3.16. Выводы по главе 3
- •3.17. Упражнения по главе 3
- •Глава 4. Файлы и каталоги
- •4.1. Введение
- •4.2. Функции stat, fstat и lstat
- •4.3. Типы файлов
- •4.4. Set-user-id и set-group-id
- •4.5. Права доступа к файлу
- •4.6. Принадлежность новых файлов и каталогов
- •4.7. Функция access
- •4.8. Функция umask
- •4.9. Функции chmod и fchmod
- •4.10. Бит sticky
- •4.11. Функции chown, fchown и lchown
- •4.12. Размер файла
- •4.13. Усечение файлов
- •4.14. Файловые системы unix-подобных ос
- •4.14.1. Обзор построения файловых систем
- •4.14.2. Основные компоненты файловой системы ext2 ос Linux
- •4.14.3. Основные компоненты группы блоков
- •4.14.4. Структура индексного узла
- •4.14.5. Структура обычного файла
- •4.14.6. Структура каталогов
- •4.15. Функции link, unlink и rename
- •4.16. Символические ссылки
- •4.17. Функции symlink и readlink
- •4.18. Временные характеристики файлов
- •4.19. Функция utime
- •4.20. Функции mkdir и rmdir
- •4.21. Чтение каталогов
- •4.22. Функции chdir, fchdir, getcwd и chroot
- •4.23. Специальные файлы устройств
- •4.24. Выводы по главе 4
- •4.25. Упражнения по главе 4
- •Глава 5. Стандартная библиотека ввода-вывода
- •5.1. Введение
- •5.2. Потоки и объекты file
- •5.3. Стандартные потоки ввода, вывода и вывода сообщений об ошибках
- •5.4. Буферизация
- •5.5. Открытие и закрытие потока
- •5.6. Чтение из потока и запись в поток
- •5.6.1. Ввод-вывод символов
- •5.6.2. Построчный ввод-вывод
- •5.6.3. Ввод-вывод двоичных данных
- •5.7. Позиционирование в потоке
- •5.8. Форматированный ввод-вывод
- •5.9. Подробности реализации
- •5.10. Временные файлы
- •5.11. Выводы по главе 5
- •5.12. Упражнения по главе 5
- •Глава 6. Информация о системе и файлы данных
- •6.1. Введение
- •6.2. Файл паролей
- •6.3. Теневые пароли
- •6.4. Файл групп
- •6.5. Идентификаторы дополнительных групп
- •6.6. Прочие файлы данных
- •6.7. Учет входов в систему
- •6.8. Информация о системе
- •6.9. Функции даты и времени
- •6.10. Выводы по главе 6
- •6.11. Упражнения по главе 6
6.3. Теневые пароли
Зашифрованный пароль – это пароль пользователя, пропущенный через односторонний алгоритм шифрования. Поскольку алгоритм является односторонним, невозможно получить оригинальный пароль, имея его зашифрованную версию.
Чтобы затруднить доступ к зашифрованным паролям, современные системы хранят их в другом файле – /etc/shadow, который часто называют теневым файлом паролей. Этот файл должен содержать как минимум имена пользователей и зашифрованные пароли.
Обязательными являются только два поля – имя пользователя (sp_namp) и зашифрованный пароль (sp_pwdp). В скобках указаны названия соответствующих полей структуры spwd, которая определена в заголовочном файле <shadow.h>. Другие поля хранят информацию о том, как часто должен изменяться пароль и как долго будет оставаться активной учетная запись.
Теневой файл паролей не должен быть доступен на чтение для всех. Доступ к нему должны иметь лишь несколько программ, например login и passwd. Владельцем таких программ является суперпользователь, и для них устанавливается бит set-user-ID. При использовании теневых паролей обычный файл паролей, /etc/passwd, может быть доступен для чтения любому.
В ОС Linux для доступа к теневому файлу паролей предусмотрен отдельный набор функций, которые очень похожи на те, что используются для работы с обычным файлом паролей.
#include <shadow.h>
struct spwd *getspnam (const char *name);
struct spwd *getspent (void);
/* обе функции возвращают непустой указатель на структуру spwd в случае успеха, NULL – в случае ошибки */
void setspent (void);
void endspent (void);
6.4. Файл групп
Файл групп Unix, называемый в стандарте Posix.1 базой данных групп, содержит поля, которые перечислены в табл. 6.3. Значения этих полей хранятся в структуре group, определенной в файле <grp.h>. Поле gr_mem представляет собой массив указателей на имена пользователей, которые входят в состав группы. Этот массив завершается пустым указателем.
Таблица 6.3
Поля файла /etc/group
Поле структуры group |
Описание |
char *gr_name |
Имя группы |
char *gr_passwd |
Зашифрованный пароль |
gid_t gr_gid |
Числовой идентификатор группы |
char **gr_mem |
Массив указателей на имена членов группы |
Для поиска имени группы или ее числового идентификатора в файле групп стандарт Posix.1 определяет следующие две функции.
#include <grp.h>
struct group *getgruid (gid_t gid);
struct group *getgrnam (const char *name);
/* обе функции возвращают непустой указатель на структуру group в случае успеха, NULL – в случае ошибки */
Как и в случае с файлом паролей, обе функции возвращают указатель на статическую переменную, которая при каждом обращении к функции перезаписывается.
Чтобы произвести поиск по всему файлу групп, потребуются некоторые дополнительные функции. Следующие три функции напоминают те, что используются для работы с файлом паролей.
#include <grp.h>
struct group *getgrent (void);
/* функция возвращает непустой указатель на структуру group в случае успеха, NULL – в случае ошибки или по достижении конца файла */
void setgrent (void);
void endgrent (void);
Функция setgrent открывает файл групп, если он еще не был открыт, и переходит в его начало. Функция getgrent считывает очередную запись из файла групп, предварительно открыв его, если он еще не был открыт. Функция endgrent закрывает файл групп.