Разработка приложений в среде Linux. Второе издание
Шрифт:
Каталоги имеют тот же набор бит доступа, что и нормальные файлы, но со слегка отличающейся семантикой. Права чтения разрешают процессам доступ к самому каталогу, что дает возможность пользователям получать список содержимого каталога. Права на запись позволяют процессу создавать новые файлы в каталоге и удалять существующие. Бит выполнения, однако, не транслируется так однозначно (что вообще должно означать выполнение каталога?). Это позволяет процессу осуществлять поиск в каталоге, а это означает, что он может иметь доступ к файлу в каталоге, если он знает имя этого файла.
Большинство системных каталогов на машинах Linux имеют права доступа 0755 и принадлежат пользователю root. Это дает возможность пользователям системы просматривать файлы в каталоге и получать доступ к ним по имени, но разрешает запись в каталоги только пользователю root. Анонимные ftp-сайты, которые позволяют любому пользователю отправлять файлы, но не дают возможность им загружать их до тех пор, пока
Дополнительную информацию о правах доступа к файлам можно найти в любой книге по Linux или Unix.
11.1.2. Модификаторы прав доступа к файлам
Модификаторы прав доступа файлов — это также битовые маски, значения которых представляют биты setuid, setgid и sticky-бит ("липкий" бит). Если бит setuid установлен для исполняемого файла, то эффективный идентификатор пользователя процесса устанавливается равным идентификатору владельца файла, когда программы выполняется (в главе 10 можно найти информацию о том, почему это удобно). Бит setgid ведет себя аналогичным образом, но устанавливает эффективный идентификатор группы в значение группы файла. Бит setuid не имеет значения для неисполняемых файлов, но если бит setgid устанавливается для неисполняемого файла, любая блокировка, выполняемая над файлом, носит обязательный, а не рекомендательный характер (см. главу 13). В Linux биты setuid и setgid игнорируются для сценариев оболочки, поскольку устанавливать setuid для сценариев было бы опасно.
Ни setuid, ни setgid не имеют очевидного смысла для каталогов. И setuid действительно не имеет семантики установки для каталогов. Если же для каталога установлен бит setgid, то все новые файлы, созданные в этом каталоге, будут принадлежать к той же группе, которая владеет самим каталогом. Это облегчает применение каталогов для организации совместной работы пользователей.
Sticky-бит — последний значащий бит в разряде модификатора доступа к файлу, имеет интересную историю, связанную с его наименованием. Старые реализации Unix должны были загружать в память всю программу целиком, прежде чем начать выполнять ее. Это означало, что крупные программы отнимали значительное время на запуск, что было довольно-таки неприятно. Если же программа имела установленный sticky-бит, то операционная система пыталась сохранить ее "привязанной" в памяти настолько долго, насколько возможно, даже когда эта программа не запущена, чтобы уменьшить время запуска. Хотя это было немного некрасиво, но работало достаточно хорошо с часто используемыми программами, такими как компилятор С. Современные реализации Unix, включая Linux, используют загрузку по требованию — кусочек за кусочком, что сделало sticky-бит излишним, поэтому Linux игнорирует его для обычных файлов.
Sticky-бит по-прежнему используется для каталогов. Обычно любой пользователь с правами записи в каталог может удалить любой файл в этом каталоге. Однако если sticky-бит каталога установлен, файлы могут быть удалены только пользователем-владельцем либо пользователем root. Такое поведение удобно, если каталог служит репозиторием для файлов, созданных многими пользователями, например,
Последний раздел режима файла указывает тип файла. Он содержится в старших восьмеричных разрядах и не является битовой маской. Вместо этого значение этих разрядов равно специфическому типу файлов (04 означает каталог, 06 — блочное устройство). Тип файла устанавливается при его создании. Он никогда не может быть изменен, кроме как посредством удаления файла.
Включаемый файл
Таблица 11.1. Константы прав доступа к файлам
Имя | Значение | Описание |
---|---|---|
S_ISUID | 0004000 | Программа является setuid-программой. |
S_ISGID | 0002000 | Программа является setgid-программой. |
S_ISVTX | 0001000 | Sticky-бит. |
S_IRWXU | 00700 | Владелец файла имеет права на чтение, запись и выполнение. |
S_IRUSR | 00400 | Владелец файла имеет права на чтение. |
S_IWUSR | 00200 | Владелец файла имеет права на запись. |
S_IXUSR | 00100 | Владелец файла имеет права на выполнение. |
S_IRWXG | 00070 | Группа файла
|
S_IRGRP | 00040 | Группа файла имеет права на чтение. |
S_IWGRP | 00020 | Группа файла имеет права на запись. |
S_IXGRP | 00010 | Группа файла имеет права на выполнение. |
S_IRWXO | 00007 | Прочие пользователи имеют права на чтение, запись и выполнение. |
S_IROTH | 00004 | Прочие пользователи имеют права на чтение. |
S_IWOTH | 00002 | Прочие пользователи имеют права на запись. |
S_IXOTH | 00001 | Прочие пользователи имеют права на выполнение. |
11.1.3. Типы файлов
Старшие четыре бита режима файла указывают тип файла. В табл. 11.2 перечислены константы, имеющие отношение к типам файлов. Объединение с помощью битовой операции "И" любых этих констант с режимом файла порождает ненулевое значение, если бит установлен.
Таблица 11.2. Константы типов файлов
Имя | Значение (восьмеричное) | Описание |
---|---|---|
S_IFMT | 00170000 | Это значение, побитно объединенное с режимом с помощью операции "И", дает тип файла (который эквивалентен одному из остальных значений S_IF ). |
S_IFSOCK | 0140000 | Файл является сокетом. |
S_IFLNK | 0120000 | Файл является символической ссылкой. |
S_IFREG | 0100000 | Файл является обычным файлом. |
S_IFBLK | 0060000 | Файл представляет блочное устройство. |
S_IFDIR | 0040000 | Файл является каталогом. |
S_IFCHR | 0020000 | Файл представляет символьное устройство. |
S_IFIFO | 0010000 | Файл представляет коммуникационный канал "первый вошел — первый вышел". |
Описанные ниже макросы принимают в качестве аргумента режим файла и возвращают
S_ISLINK(m) | Истинно, если файл является символической ссылкой. |
S_ISREC(m) | Истинно, если файл является обычным файлом. |
S_ISDIR(m) | Истинно, если файл является каталогом. |
S_ISCHR(m) | Истинно, если файл представляет символьное устройство. |
S_ISBLK(m) | Истинно, если файл представляет блоковым устройство. |
S_ISFIFO(m) | Истинно, если файл является каналом "первый вошел — первый вышел" |
S_ISSOCK(m) | Истинно, если файл является сокетом. |
11.1.4. Маска umask процесса
Права доступа, назначаемые вновь созданным файлам, зависят как от настроек системы, так и от предпочтений конкретного пользователя. Чтобы помочь индивидуальным программам, которые нуждаются в предположениях об использовании файла, система дает возможность пользователям отключить отдельные привилегии для вновь создаваемых файлов (и каталогов, которые являются специальными файлами). Каждый процесс имеет маску umask, определяющую отключенные биты привилегий для создания файлов. Это позволяет процессу специфицировать достаточно либеральные права (обычно это касается общих прав на чтение и запись) и обеспечивать права, которые пользователь предпочитает. Если определенный файл особо важен, процесс создания может включать назначение более ограниченных прав, чем обычно, потому что umask никогда не влияет на менее строгие ограничения прав, а только на более строгие.