Книга: Linux программирование в примерах
4.6.1. Определение начальных прав доступа к файлу
4.6.1. Определение начальных прав доступа к файлу
Как пользователь GNU/Linux, вы знакомы с правами доступа к файлу, выдаваемыми командой 'ls -l
': на чтение, запись и исполнение для каждого из владельца файла, группы и остальных. Различные сочетания часто выражаются в восьмеричной форме, в частности, для команд chmod
и chmask
. Например, права доступа к файлу -rw-r--
r-- эквивалентны восьмеричному 0644, a -rwxr-xr-x
эквивалентно восьмеричному 0755. (Ведущий 0 в нотации С означает восьмеричные значения.)
Когда вы создаете файл, вы должны знать, какую защиту необходимо назначить новому файлу. Вы можете сделать это с помощью простого восьмеричного числа, если захотите, и такие числа довольно обычно можно увидеть в старом коде. Однако, лучше использовать побитовую операцию OR для одной или более символических имен из <sys/stat.h>
, описанных в табл. 4.5.
Таблица 4.5. Символические имена POSIX для режимов доступа к файлу
Символическое имя | Значение | Комментарий |
---|---|---|
S_IRWXU |
00700 | Разрешение на чтение, запись и исполнение для владельца |
S_IRUSR |
00400 | Разрешение на чтение для владельца |
S_IREAD |
Аналогично S_IRUSR |
|
S_IWUSR |
00200 | Разрешение на запись для владельца |
S_IWRITE |
Аналогично S_IWUSR |
|
S_IXUSR |
00100 | Разрешение на исполнение для владельца. |
S_IEXEC |
Аналогично S_IXUSR |
|
S_IRWXG |
00070 | Разрешение на чтение, запись и исполнение для группы |
S_IRGRP |
00040 | Разрешение на чтение для группы |
S_IWGRP |
00020 | Разрешение на запись для группы. |
S_IXGRP |
00010 | Разрешение на исполнение для группы |
S_IRWXO |
00007 | Разрешение на чтение, запись и исполнение для остальных. |
S_IROTH |
00004 | Разрешение на чтение для остальных. |
S_IWOTH |
00002 | Разрешение на запись для остальных |
S_IXOTH |
00001 | Разрешение на исполнение для остальных |
Следующий фрагмент показывает, как создать переменные, представляющие разрешения -rw-r--r--
и -rwxr-xr-x
(0644 и 0755 соответственно):
mode_t rw_mode, rwx_mode;
rw_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; /* 0644 */
rwx_mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; /* 0755 */
Более старый код использовал S_IREAD
, S_IWRITE
и S_IEXEC
вместе со сдвигом битов для получения того же результата:
mode_t rw_mode, rwx_mode;
rw_mode = (S_IREAD|S_IWRITE) | (S_IREAD >> 3) | (S_IREAD >> 6); /* 0644 */
rwx_mode = (S_IREAD|S_IWRITE|S_IEXEC) |
((S_IREAD|S_IEXEC) >> 3) | ((S_IREAD|S_IEXEC) >> 6); /* 0755 */
К сожалению, ни одна из записей не является очень удобной. Современные версии предпочтительнее, поскольку у каждого бита доступа есть собственное имя и меньше вероятность неправильного выполнения побитовых операций.
При изменении прав доступа к файлу для использования доступны биты дополнительных разрешений, показанные в табл. 4.6, но они не должны использоваться при первоначальном создании файла. Возможность включения этих битов широко варьирует между операционными системами. Лучше всего не пробовать; вместо этого следует изменить права доступа к файлу явным образом после его создания. (Изменение прав доступа описано в разделе 5.5.2 «Изменение прав доступа: chmod()
и fchmod()
». Значения этих битов обсуждаются в главе 11 «Права доступа и идентификаторы пользователя и группы».)
Таблица 4.6. Дополнительные символические имена POSIX для режимов доступа к файлам
Символическое имя | Значение | Смысл |
---|---|---|
S_ISUID |
04000 | Установить ID пользователя |
S_ISGID |
02000 | Установить ID группы |
S_ISVTX |
01000 | Сохранить текст |
Когда стандартные утилиты создают файлы, они по умолчанию используют права доступа -rw-rw-rw-
(или 0666). Поскольку большинство пользователей предпочитают избегать файлов, в которые может записывать кто угодно, каждый процесс имеет при себе umask. umask
является набором битов допуска, указывающим те биты, которые никогда не должны устанавливаться при создании новых файлов, (umask не используется при изменении прав доступа.) Концептуально осуществляется операция
действительные_права = (затребованные_права & (~umask));
обычно устанавливается с помощью команды
umaskumask
в $НОМЕ/.profile
, когда вы входите в систему. Из программы С она устанавливается с помощью системного вызова umask()
.
#include <sys/types.h> /* POSIX */
#include <sys/stat.h> mode_t umask(mode_t mask);
Возвращается старое значение umask
. Поэтому для определения текущей маски нужно установить новое значение, а затем восстановить старое (или изменить его при необходимости):
mode_t mask = umask(0); /* получить текущую маску */
(void)umask(mask); /* восстановить ее */
Вот пример работы umask
на уровне оболочки:
$ umask /* Показать текущую маску */
0022
$ touch newfile /* Создать файл */
$ ls -l newfile /* Показать права доступа нового файла */
-rw-r--r-- 1 arnold devel 0 Mar 24 15:43 newfile
$ umask 0 /* Установить пустую маску */
$ touch newfile2 /* Создать второй файл */
$ ls -l newfile2 /* Показать права доступа нового файла */
-rw-rw-rw- 1 arnold devel 0 Mar 24 15:44 newfile2
- Правила творческой лени
- Права для выполнения резервного копирования
- Правильная стратегическая последовательность
- Ничего, кроме правды: поведение потребителей
- Заполнение справочников и каталогов
- Неисправности источника бесперебойного питания
- Неисправности акустических систем
- Основные "рычаги" управления производительностью
- Права
- Раздача прав
- Аннулирование прав
- Как правильно раздавать и аннулировать права