- •2.1. Введение
- •2.2. Вопросы, относящиеся к команде who
- •2.2.1. Программы состоят из команд
- •2.3. Вопрос 1: Что делает команда who?
- •2.3.1. Обращение к справочнику
- •2.4. Вопрос 2: Как работает команда who?
- •2.4.1. Мы теперь знаем, как работает who
- •2.5. Вопрос 3: Могу ли я написать who?
- •2.5.1. Вопрос: Как я буду читать структуры из файла?
- •2.5.2. Ответ: Использование open, read и close
- •2.5.3. Написание программы who 1.С
- •2.5.4. Отображение записей о вхождениях в систему
- •2.5.5. Написание версии who2.С
- •2.6. Проект два: Разработка программы ср (чтение и запись)
- •2.6.1. Вопрос 1: Что делает команда ср?
- •2.6.2. Вопрос 2: Как команда ср создает файл и как пишет в него? Создание/транкатенация файла
- •2.6.3. Вопрос 3: Могу ли я написать программу ср?
- •2.6.4. Программирование в Unix кажется достаточно простым
- •2.7. Увеличение эффективности файловых операций ввода/ вывода: Буферирование
- •2.7.1. Какой размер буфера следует считать лучшим?
- •2.7.2 Почему на системные вызовы требуется тратить время?
- •2.7.3. Означает ли, что наша программа who2.С неэффективна?
- •2.7.4. Добавление буферирования к программе who2.С
- •2.8. Буферизация и ядро
- •2.8.1. Если буферизация столь хороша, то почему ее не использует ядро?
- •2.9. Чтение файла и запись в файл
- •2.9.1. Выход из системы: Что происходит?
- •2.9.2. Выход из системы: Как это происходит
- •2.9.3. Смещение текущего указателя: Iseek
- •2.9.4. Кодирование выхода из системы через терминал
- •2.10. Что делать с ошибками системных вызовов?
- •3.1. Введение
- •3.2. Вопрос 1: Что делает команда is?
- •3.2.1. Команда Is выводит список имен файлов и оповещает об атрибутах файлов
- •3.2.3. Наиболее употребимые опции
- •3.2.4. Первый ответ: Итоговые замечания
- •3.3. Краткий обзор дерева файловой системы
- •3.4. Вопрос 2: Как работает команда Is?
- •3.4.1. Что же такое каталог, в конце концов?
- •3.4.2. Работают ли системные вызовы open, read и close в отношении каталогов?
- •3.4.3. Хорошо, хорошо. Но как же мне прочитать каталог?
- •3.5. Вопрос 3: Могу ли я написать Is?
- •3.5.1. Что еще нужно делать?
- •3.6. Проект 2: Написание версии Is -I
- •3.6.1. Вопрос 1: Что делает Is-I?
- •3.6.2. Вопрос 2: Какработает Is -I?
- •3.6.3. Ответ: Системный вызов stat получает информацию о файле
- •3.6.4. Какую еще информацию можно получить с помощью системного вызова stat?
- •3.6.5. Чего мы достигли?
- •3.6.6. Преобразование числового значения поля mode в символьное значение
- •3.6.7. Преобразования числового представления идентификаторов собственника/группы в строковое представление
- •3.6.8. Объединение всего вместе: Is2.C
- •3.7. Три специальных разряда
- •3.7.1. Разряд Set-User-id
- •3.7.2Разряд Set-Group-id
- •3.7.3 Разряд Sticky Bit
- •3.7.4. Специальные разряды nls-l
- •3.8. Итоги для команды is
- •3.9. Установка и модификация свойств файла
- •3.9.1. Тип файла
- •3.9.2. Разряды прав доступа и специальные разряды
- •3.9.3. Число ссылок на файл
- •3.9.4. Собственник и группа для файла
- •3.9.5. Размер файла
- •3.9.6. Время последней модификации и доступа
- •3.9.7. Имя файла
3.7. Три специальных разряда
Поле s,t_mode в структуре stat содержит шестнадцать разрядов. Четыре разряда используются для хранения типа файла, девять - для хранения прав доступа. Три оставшихся разряда используются для организации действий со специальными атрибутами файла.
3.7.1. Разряд Set-User-id
Первый из трех специальных разрядов называется set-user-ID. Он используется для решения важного вопроса:
Как может обычный пользователь изменить его или ее пароль?
Это легко сделать, используя команду passwd. Но как работает команда passwd? Заметьте - кто является собственником и каковы права доступа к файлу паролей.
$ Is -I /etc/passwd
-rw-r--r-- 1 root root 894 Jun 2019:17/etc/passwd
Изменение вашего пароля означает изменение вашей учетной записи в этом файле, но вы I не имеете прав доступа на запись в этот файл. Права на запись имеет только пользователь с именем root. Как добиться при использовании программы passwd, чтобы вы получи- ! ли бы право на изменение файла, который не имеете права изменять? Почувствовали проблему?
Решением будет предоставление прав на запись программе, но не вам. Вы используете программу /usr/bin/passwd или /bin/passwd для изменения вашего пароля, собственником ко- i торой является root и для которой установлен разряд set-user-ID. Права доступа будут выглядеть так:
$ Is -I /usr/bin/passwd
-r-sr-xr-x 1 root bin 15725 0ct31 1997/usr/bin/passwd
Установленный разряд suro сообщает ядру о необходимости запускать программу так, что предполагается, что программу запустили не вы, а собственник этой программы. Название разряда set-user-ID (Буквальный перевод - установить идентификатор пользователя, j Но в русскоязычной литературе название этого разряда не переводится. - Примеч. пер.) подчеркивает тот факт, что этот разряд требует у ядра присвоения эффективному пользовательскому идентификатору значения пользовательского идентификатора собственника программы. Пользователь root является собственником файла /etc/passwd. Поэтому программа, которая запускается в статусе root, может модифицировать учетный файл.
Не означает ли это, что я могу изменять пароли других пользователей?
Нет. Программа passwd знает, кто вы такой. Она использует системный вызов getuid, чтобы узнать с помощью ядра - какой был у вас UID, когда вы вошли в систему. Программе passwd предоставлена возможность перезаписывать любые записи в учетном файле, но она будет изменять только запись, которая принадлежит пользователю, который запустил программу passwd.
Другие случаи использования разряда Set-User-ID
Разряд suid может быть использован некой программой, которая должна контролировать доступ к файлу или к каким-то другим ресурсам. Рассмотрим систему печати с буферизацией (систему спулинга). Для многих пользователей возникает необходимость распечатать свои файлы, но принтер может печатать в каждый момент времени только один файл. В Unix есть команда Ipr. (В HP-UX утверждается, что Ipr - это команда печати для Linux, а для Unix - 1р. - Примеч. ред.) Команда копирует ваш файл в каталог, где он будет ждать, когда он будет распечатан. Но было бы рискованным разрешить всем пользователям копировать свои файлы в этот каталог для спулинга и разрешать им модифицировать списки имен файлов, которые ждут в очереди на печать. Реально все происходит так. У программы Ipr собственником является root или Ipr, и для нее установлен разряд set-uid. Когда вы, обычный пользователь, используете команду Ipr, то программа будет запущена с установленным значением root или Ipr для эффективного UID и может теперь модифицировать содержание каталога для спулинга и соответствующих файлов в нем. Программы для удаления заданий на печать из очереди на печать также имеют установленные разряды set-uid.
Компьютерные игры, которые модифицируют базы данных со счетчиками для игроков или читают файлы с секретными планами, будут маркироваться так, что они будут запускаться пользователем и работать в статусе собственника базы данных или секретных фай-пов. Любой пользователь может играть, но только программа игры может модифицировать списки со счетом или читать секретные планы.
Маска для определения значения разряда SUID
Программа может проверить, установлен ли разряд set-user-ID для файла, с помощью маски, которая определена в заголовочном файле: <sys/stat.h>. Определение такое:
#define SJSUID 0004000 /* set user id на исполнение */
Вы можете убедиться, что маска выбирает первый из трех специальных битов.
