Я пытаюсь лучше понять разрешения, поэтому я делаю "упражнения". Вот последовательность команд, которые я использую с соответствующим выводом:
$ 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--
(группа и другие уже не имели разрешения на исполнение)