Home » Linux » Вычисление прав по маске Umask

Вычисление прав по маске Umask

По канонам Unix вновь создаваемым файлам и папкам присваиваются права по умолчанию в зависимости от маски umask, которая назначается каждому пользователю в его конфигурационном файле bash_profile. Узнать текущее значение umask можно одноимённой командой:

# umask
0022

Прежде чем переходить непосредственно к рассмотрению маски, отмечу, что максимально возможные права для файлов могут быть 666 (rw-rw-rw), то есть полные права на чтение и запись, а для папок — 777. Это значит, что вновь создаваемый файл не может быть сделан исполняемым — атрибут исполнения (x) можно выставить только дополнительной командой chmod.

Итак, вернёмся к маске. Как уже отмечалось выше, маска предназначена для выставления прав по умолчанию на вновь создаваемые файлы и папки. Выполняется это путём наложения её на максимально возможные права по правилу 666/777 И НЕ umask. Под наложением понимается выполнение побитовых операций над каждым из трёх разрядов прав. Рассмотрим это на конкретном примере и вычислим результат для первого разряда операции 666 И НЕ 367, т.е. 6 И НЕ 3.

Для выполнения побитовых операций перейдём к двоичному представлению. В двоичном представлении 6 И НЕ 3 выглядит как 110 И НЕ 011, причём операции производятся поэтапно, начиная с последнего операнда по принципу 110 (И (НЕ 011)).

Сначала вычислим НЕ 011:

НЕ
011
---
100

Теперь 110 И 100:

110
И
100
---
100

Таким образом, получим цифру 4 в десятичном представлении двоичного числа 100. Точно так же права вычисляются и для остальных двух восьмеричных разрядов.

Можно ли без подобных выкладок быстро вычислить права на файл или папку по маске? Оказывается, очень легко. Для этого достаточно лишь знать порязрядное соответствие цифр маски цифрам прав доступа на папку или файл. Поскольку таких цифр всего восемь, то существуют следующие соответствия:

 

Как видно из таблицы, легче всего права вычисляются для папок: для этого нужно из 7 просто вычесть значение числа в маске. В нашем случае 777-367=410.

В случае файла вычитание даст тот же результат только для чётных цифр. Для нечётных цифр выбирается меньшее чётное, т.е. для 1 → 0, для 3 → 2 и так далее. В нашем случае маска 367 приводится к виду 266 и только потом вычитается из 666, что даёт 666-266=400.

В итоге, нам не нужно никаких калькуляторов или математических способностей для вычисления прав по маске — побитовые операции легко заменяются обычными арифметическими операциями над привычными числами.

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Do NOT follow this link or you will be banned from the site!