Я нашел этот пример под названием: ACL и MASK в Linux . В этой статье демонстрируются следующие примеры, которые, как мне кажется, помогают понять, как работают ACL и как они umask
взаимодействуют друг с другом.
Задний план
При создании файла в системе Linux 0666
применяются разрешения по умолчанию , тогда как при создании каталога 0777
применяются разрешения по умолчанию .
пример 1 - файл
Предположим, мы установили наш umask на 077 и коснулись файла. Мы можем использовать, strace
чтобы увидеть, что на самом деле происходит, когда мы делаем это:
$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-------. 1 root root 0 Sep 4 15:25 testfile
В этом примере мы видим, что системный вызов open()
выполняется с разрешениями 0666, однако, когда umask 077
ядро затем применяет его, следующие разрешения удаляются ( ---rwxrwx
), и у нас остаётся rw-------
0600.
пример - 2 каталог
Та же концепция может быть применена к каталогам, за исключением того, что вместо разрешений по умолчанию 0666, они 0777.
$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir
mkdir("testdir", 0777) = 0
drwxr-xr-x 2 saml saml 4096 Jul 9 10:55 testdir
На этот раз мы используем mkdir
команду. Затем mkdir
команда вызывает системный вызов mkdir()
. В приведенном выше примере мы видим, что mkdir
команда вызвала mkdir()
системный вызов с разрешениями по умолчанию 0777
( rwxrwxrwx
). На этот раз с umask 022
удаляются следующие разрешения ( ----w--w-
), поэтому мы оставляем 0755 ( rwxr-xr-x
) при создании каталогов.
пример 3 (применение ACL по умолчанию)
Теперь давайте создадим каталог и продемонстрируем, что происходит, когда к нему применяется ACL по умолчанию вместе с файлом внутри него.
$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir
$ getfacl --all-effective acldir
# file: acldir
# owner: saml
# group: saml
user::rwx
user:nginx:rwx #effective:rwx
group::r-x #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx #effective:rwx
default:group::r-x #effective:r-x
default:mask::rwx
default:other::r-x
Теперь давайте создадим файл aclfile
:
$ strace -s 128 -fvTttto luvly touch acldir/aclfile
# view the results of this command in the log file "luvly"
$ less luvly
Теперь получите разрешения для вновь созданного файла:
$ getfacl --all-effective acldir/aclfile
# file: acldir/aclfile
# owner: saml
# group: saml
user::rw-
user:nginx:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
Обратите внимание на маску mask::rw-
. Почему это не mask::rwx
так, как когда каталог был создан?
Проверьте luvly
файл журнала, чтобы увидеть, какие разрешения по умолчанию были использованы для создания файла:
$ less luvly |grep open |tail -1
10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>
Это где это немного сбивает с толку. С маской, установленной rwx
при создании каталога, вы ожидаете того же поведения при создании файла, но это не работает таким образом. Это потому, что ядро вызывает open()
функцию с разрешениями по умолчанию 0666
.
Подвести итоги
- Файлы не получат разрешение на выполнение (маскирование или эффективное). Не имеет значения, какой метод мы используем: ACL, umask или mask & ACL.
- Каталоги могут получать разрешения на выполнение, но это зависит от того, как установлено поле маскирования.
- Единственный способ установить разрешения на выполнение для файла, который находится под разрешениями ACL, - это установить их вручную
chmod
.
Ссылки
mask::rw-
. Но это не совсем твой вопрос, верно?