При создании файла или каталога ему присваивается набор прав доступа по умолчанию. Для обычного файла режим доступа составляет rw- rw- rw- (в двоичном представлении: 110 110 110, в восьмеричном представлении: 6 6 6), для каталога - rwx rwx rwx (в двоичном представлении: 111 111 111, в восьмеричном представлении: 7 7 7).
Но если мы попробуем создать новый файл, то увидим, что режим доступа по умолчанию к нему немного отличается:
ls -l
total 0
touch file1
ls -l
-rw-rw-r-- 1 hex hex 0 июн 6 13:22 file1
Дело в том, что в процесс определения режима доступа ко вновь создаваемым файлам (каталогам) вмешивается так называемая маска umask (user file creation mode mask), значение которой равно 0002. Это значение по умолчанию в Ubuntu (для других дистрибутивов оно может отличаться: например, в Debian равно 0022) и, как мы это увидим в дальнейшем, его можно изменять.
Как же формируется итоговый набор прав доступа к новым файлам с учётом действия umask? Давайте рассмотрим это на примере создания нового файла. При этом, для большей наглядности и понимания, режим прав доступа к файлу будем рассматривать в двоичном представлении, а в значении маски 0002 нас будут интересовать только последние три цифры 002 заданные в восьмеричном представлении (лидирующая цифра (0 в данном примере) нас сейчас не интересует).
Маску можно посмотреть с помощью соответствующей команды umask:
umask
0002
Итак, полный режим доступа к файлу (без учёта маски):
rw- rw- rw- (110 110 110)
Значение маски (в двоичном представлении):
000 000 010 (повторимся, нас сейчас интересуют только три последних позиции маски 0 0 2)
Итоговый режим доступа (с учётом маски):
rw- rw- r-- (110 110 100)
А теперь наглядно сопоставим измения в табличке:
| Представление | Двоичное | Символическое |
|---|---|---|
| Полный режим | 110 110 110 | rw - rw - rw - |
| Маска | 000 000 010 | 000 000 010 |
| Итоговый режим | 110 110 100 | rw - rw - r - - |
Права доступа к файлу задаются девятью позициями (3 позиции для владельца файла + 3 для группы + 3 для остальных пользователей). Значению каждой позиции сопоставляются значения маски: если внимательно присмотреться, то можно заметить, что в тех позициях, где значение в маске равно единице, происходит "сброс" соответствующего атрибута прав доступа. То есть, соответствующее право доступа в конкретной позиции (где в маске встречается единица) аннулируется — таким образом формируется итоговый режим прав доступа.
В примере выше маска 000 000 010 аннулирует восьмую (право на запись w для остальных пользователей) позицию режима доступа к файлу. Именно поэтому rw- rw- rw- трансформируется в rw- rw- r-- (или, если в двоичном представлении: 110 110 110 трансформируется в 110 110 100).
Изменение маски
Маску легко изменить. В рамках текущей сессии это делается путём передачи нового значения команде umask:
umask # проверяем текущее значение маски
0002
umask 0000 # устанавливаем новое значение маски
umask # проверяем новое значение маски
0000
В этом примере мы фактически "обнулили" маску, установив все нули. Теперь маска никак не будет воздействовать на исходный режим доступа, устанавливаемый по умолчанию (нет единиц в маске - значит нигде не будет производиться аннулирование правил доступа!).
Теперь попробуем создать новый файл file2:
ls -l
-rw-rw-r-- 1 hex hex 0 июн 6 13:22 file1
touch file2
ls -l
-rw-rw-r-- 1 hex hex 0 июн 6 13:22 file1
-rw-rw-rw- 1 hex hex 0 июн 6 14:57 file2
При "нулевой" маске итоговый режим доступа к созданному файлу соответствует полному режиму по умолчанию rw- rw- rw- (т.е. маска никак на него не воздействовала). Сравните это с режимом доступа к файлу с именем file1, который мы создали ранее, когда маска была равна 000 000 010.
В табличном виде это выглядит так:
| Представление | Двоичное | Символическое |
|---|---|---|
| Полный режим | 110 110 110 | rw - rw - rw - |
| Маска | 000 000 000 | 000 000 000 |
| Итоговый режим | 110 110 110 | rw - rw - rw - |
Задача
Допустим, мы не хотим, чтобы для вновь создаваемых файлов участники их группы имели право на запись. То есть нам надо аннулировать это право w для группы. Для этого надо изменить маску по умолчанию 0002 (000 000 000 010) на 0022 (000 000 010 010). Обратите внимание, что сейчас мы показываем полное значение маски в формате с лидирующими нулями (см. примечание по этому поводу выше).
umask 0022
umask
0022
ls -l
-rw-rw-r-- 1 hex hex 0 июн 6 13:22 file1
-rw-rw-rw- 1 hex hex 0 июн 6 14:57 file2
touch file3
ls -l
-rw-rw-r-- 1 hex hex 0 июн 6 13:22 file1
-rw-rw-rw- 1 hex hex 0 июн 6 14:57 file2
-rw-r--r-- 1 hex hex 0 июн 6 15:15 file3
Выше мы изменили маску на 022 (000 010 010) и создали новый файл с именем file3.
| Представление | Двоичное | Символическое |
|---|---|---|
| Полный режим | 110 110 110 | rw - rw - rw - |
| Маска | 000 010 010 | 000 010 010 |
| Итоговый режим | 110 100 100 | rw - r - - r - - |
Маска 000 010 010 аннулирует пятую (право на запись w для группы) и восьмую (право на запись w для остальных пользователей) позицию режима доступа к файлу. Именно поэтому rw- rw- rw- трансформируется в rw- r-- r-- (или, если в двоичном представлении: 110 110 110 трансформируется в 110 100 100).
Сравните это с режимом доступа к файлу с именем file1, который мы создали ранее, когда маска была равна 002 (000 000 010), и с режимом доступа к файлу с именем file2, который мы создали, когда маска была равна 000 (000 000 000).
Заключение
Отметим напоследок, что изменение маски является достаточно редкой операцией в практике unix-пользователя. Её следует применять только тогда, когда вы точно знаете что и для какой цели делаете. Значение маски по умолчанию, как правило, является оптимальным в плане безопасности и комфорта для рядового пользователя.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.