Почему некоторые значения umask не вступают в силу?

9

Я пытаюсь лучше понять разрешения, поэтому я делаю "упражнения". Вот последовательность команд, которые я использую с соответствующим выводом:

$ 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--  

(группа и другие уже не имели разрешения на исполнение)

ikeDiM
источник

Ответы:

26

umaskэто маска , это не вычитаемое значение. Таким образом:

  • режим 666, маска 022: результат равен 666 и ~ 022, т.е. 666 и 755, что составляет 644;
  • режим 666, маска 021: результат равен 666 и ~ 021, т.е. 666 и 756, что составляет 646.

Подумайте о битах. 6 в режиме означает, что биты 1 и 2 установлены, считаны и записаны. 2 в маске маски бит 1, бит записи. 1 в маске маскирует бит 0, бит выполнения.

Другой способ представить это - посмотреть на разрешения в текстовой форме. 666 есть rw-rw-rw-; 022 есть ----w--w-; 021 есть ----w---x. Маска удаляет свои установленные биты из режима, поэтому rw-rw-rw-маскируется ----w--w-становится rw-r--r--, маскируется ----w---xстановится rw-r--rw-.

Стивен Китт
источник
11

Вы должны думать в двоичном, а не десятичном. В частности, существует три 3-битных двоичных числа: по одному для владельца, группы и другого. Каждый со значениями от 000 до 111 (0-7 в десятичном виде).

например, rw-rw-rw (666) составляет 110 110 110.

umaskЗначение маска , определяющая , какие биты будет включен или выключен (1 или 0) при создании нового файла или каталога. например, 022 десятичное число 000 010 010 двоичное, а 021 десятичное 000 010 001

Биты разрешений И-образуются вместе с отрицательной маской для достижения окончательного значения. «Отрицательный» означает, что все биты инвертированы, т. е. все 1 равны нулю, и наоборот. напримерNOT 022 (000 010 010) = 755 (111 101 101)

Пример: 666 & !022 = 644. В двоичном виде это:

  Owner  Group  Other     mode
   110    110    110      666 
&  111    101    101      755   (this is the negated 022)
   ---    ---    ---      ---
   110    100    100      644

Также 777 & !022 = 755:

  Owner  Group  Other     mode
   111    111    111      777 
&  111    101    101      755
   ---    ---    ---      ---
   111    101    101      755

Обратите внимание, что конечное значение каждого бита может быть только 1, если оно равно 1 как в исходном значении разрешения (666 или 777), так и в отрицательном значении маски. Если любой из них равен 0, результат равен 0. То есть 1 & 1 = 1 , а 1 & 0 = 0 .


Строго говоря, существует четвертое 3-битное двоичное число для setuid, setgid и sticky-битов. Вот почему вы часто видите разрешения и маски, указанные с начальным 0 (или с каким-либо другим начальным числом от 0 до 7). например, 0777 или 2755.

саз
источник
2
Ну, технически это восьмеричное, а не десятичное число, но это не меняет сути ответа.
Дэвид З
@DavidZ: OP думал, что это десятичное число (см. Пример вычитания в Q), что, по-видимому, и относится к cas.
Гонки
1
@ Осветление примеров вычитания, данных OP, работает независимо от того, являются ли они восьмеричными или десятичными, учитывая, что ни одна цифра не достигает 8, и нет необходимости в переносе. Я согласен, что возможно, что OP думал десятично, но ничто в этом вопросе не доказывает этого.
Стивен Китт
@StephenKitt: Похоже, мой палец, должно быть, поскользнулся на клавиатуре, когда я писал примеры в calc.exe, чтобы доказать это 😂
Гонки
1
@ Да, я не был не согласен с этой частью (это также основа для моего ответа), только с утверждением Легкости, что ОП вычислялось в десятичном, а не восьмеричном виде.
Стивен Китт