Чому деякі значення 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, також когерентні.

Але якщо я зміню від біти повноважень 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--  

(група та інші вже не мали дозволу на виконання)

Відповіді:


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

Біти дозволу AND-ed разом із заперечуваним umask для досягнення кінцевого значення. "заперечується" означає, що всі біти перевернуті, тобто всі 1s перевернуті на 0, і навпаки. напр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), так і в заперечному umask. Якщо будь-який з них дорівнює 0, результат дорівнює 0. Тобто 1 & 1 = 1 , тоді як 1 & 0 = 0 .


Строго кажучи, існує четвертий 3-розрядний двійковий номер для встановлених, setgid і липких бітів. Ось чому ви часто бачите дозволи та маски, вказані з провідним 0 (або іншим провідним числом від 0-7). наприклад 0777 або 2755.


2
Ну технічно це восьмеричний, а не десятковий характер, але це насправді не змінює ядро ​​відповіді.
David Z

@DavidZ: ОП подумав, що це десятковий (див. Приклад віднімання у Q), що, мабуть, стосується cas.
Гонки легкості на Орбіті

1
@ Освітлення приклади віднімання, що даються ОП, працюють, будь вони вісімкові або десяткові, враховуючи, що жодна цифра не досягає 8 і ніколи не потребує перенесення. Я згоден, можливо, що ОП думав у десятковій формі, але нічого з цього питання не доводить.
Стівен Кітт

@StephenKitt: Виглядає , як мій палець повинен послизнувся на клавіатурі , коли я писав приклади в calc.exe , щоб довести це 😂
светлота Гонки в Orbit

1
@cas так, я не погоджувався з цією частиною (це також основа для моєї відповіді), лише з твердженням Легкості, що ОП обчислюється в десяткових, а не в восьмеричних.
Стівен Кітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.