Я намагаюся краще зрозуміти дозволи, тому я роблю кілька «вправ». Ось послідовність команд, які я використовую з відповідним висновком:
$ 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--
(група та інші вже не мали дозволу на виконання)