Я пытаюсь лучше понять разрешения, поэтому я делаю "упражнения". Вот последовательность команд, которые я использую с соответствующим выводом:
$ umask
0022
$ touch file1
$ ls -l file1
-rw-r--r-- 1 user group 0 Mar 16 12:55 file1
$ mkdir dir1
$ ls -ld dir1
drwxr-xr-x 2 user group 4096 Mar 16 12:55 dir1
Это имеет смысл, потому что мы знаем, что права доступа к файлу по умолчанию - 666
( rw-rw-rw-
), а права доступа к каталогам - 777
( rwxrwxrwx
). Если я вычесть значение UMASK из этих разрешений по умолчанию у меня есть
666-022=644
, rw-r--r--
, для file1
, так что согласуется с предыдущим выходом;
777-022=755
, rwx-r-x-r-x
, Для dir1
, также когерентным.
Но если я поменяю umask с 022
на 021
это не больше.
Вот пример для файла:
$ umask 0021
$ touch file2
$ ls -l file2
-rw-r--rw- user group 0 Mar 16 13:33 file2
-rw-r--rw-
есть 646
но так и должно быть 666-021=645
. Так что это не работает в соответствии с предыдущими вычислениями.
Вот пример для каталога:
$ touch dir2
$ ls -ld dir2
drwxr-xrw- 2 user group 4096 Mar 16 13:35 dir2
drwxr-xrw-
есть 756
, 777-021=756
. Таким образом, в этом случае результат согласуется с предыдущим вычислением.
Я читал человека, но я ничего не нашел об этом поведении.
Может кто-нибудь объяснить, почему?
ОБЪЯСНЕНИЕ
Как указано в ответах: umask
значение не математически вычитается из каталога по умолчанию и прав доступа к файлу.
Эффективная операция - это комбинация логических операторов AND (&) и NOT (!). Данный:
R = результирующие разрешения
D = разрешения по умолчанию
U = текущий umask
R = D &! U
Например:
666 &! 0053 = 110 110 110 & ! 000 101 011 110 110 110 & 111 010 100 = 110 010 100 = 624 = rw - wr--
777 &! 0022 = 111 111 111 & ! 000 010 010 111 111 111 & 111 101 101 = 111 101 101 = 755 = rwxr - xr-x
ПОДСКАЗКА
Простой способ быстро узнать полученные разрешения (по крайней мере, это помогло мне) - подумать, что мы можем использовать только 3 десятичных значения:
r = 100 = 4
w = 010 = 2
x = 001 = 1
Разрешения будут комбинацией этих 3 значений.
" "
используется, чтобы указать, что относительное разрешение не дано.
666 = 4+2+" " 4+2+" " 4+2+" " = rw rw rw
Поэтому, если мой текущий umask - 0053
я знаю, я удаляю (4+1)
разрешение на чтение и выполнение из группы, а запись и выполнение - (2+1)
из другого, что приводит к
4+2 " "+2+" " 4+" "+" " = 624 = rw--w-r--
(группа и другие уже не имели разрешения на исполнение)