Setfacl

Для установки и удаления ACL используется программа sefacl.

setfacl [параметры] [{-m|-x} ACL] файлы
setfacl [параметры] [{-M|-X} файл] файлы

Для добавления и изменения ACL используется параметр –m. Например, чтобы добавить права доступа для пользователя user1, необходимо выполнить следующую команду:

$ setfacl -m u:user1:r test
$

После –m записывается ACL. Формат записи достаточно простой. Если первый символ u, то добавляются права для указанного после двоеточия пользователя. Если первый символ g — определяются права для группы. Если m — определяется маска. Сами права записываются в символьном виде.

Теперь можно посмотреть, какие ACL установлены у файла test:

$ getfacl test
# file: test
# owner: artur
# group: users
user::rw-
user:user1:r--
group::r--
mask::r--
other::r--
$

Для того, чтобы изменить права пользователя user1, необходимо выполнить следующую команду:

$ setfacl -m u:user1:rx test
$ getfacl test
# file: test
# owner: artur
# group: users
user::rw-
user:user1:r-x
group::r--
mask::r-x
other::r--
$

Как видно из примера, у пользователя user1 были изменены права доступа.

Теперь добавим в ACL группу bin:

$ setfacl -m g:bin:rwx test
$ getfacl test
# file: test
# owner: artur
# group: users
user::rw-
user:user1:r-x
group::r--
group:bin:rwx
mask::rwx
other::r--
$

В списке ACL присутствует слово mask. Это не пользователь, а специальная возможность, ограничивающая права доступа. Маска является фильтром, определяющим максимально возможные права доступа. Например, группа bin имеет полные права доступа. Мы сами дали ей эти права. Но мы можем их ограничить, определив маску.

$ setfacl -m m::rw test
$ getfacl test
# file: test
# owner: artur
# group: users
user::rw-
user:user1:r-x                  #effective:r--
group::r--
group:bin:rwx                   #effective:rw-
mask::rw-
other::r--
$

Обратите внимание на то, что после введения макси напротив пользователей и групп появилось поле, указывающее реальные права доступа. Если у группы bin при записи ее в ACL права были rwx, то теперь они стали rw-. С пользователем user1 случилось то же самое. До определения маски права были r-x, после — стали r--. При помощи маски rw- мы сказали, что право x учитываться не будет.

Внимание! На права хозяина, группы и всех остальных файла маска не влияет. Маска влияет только на дополнительных пользователей и группы.
$ chmod u+rwx test
$ getfacl test
# file: test
# owner: artur
# group: users
user::rwx
user:user1:r-x                  #effective:r--
group::r--
group:bin:rwx                   #effective:rw-
mask::rw-
other::r--
$
Внимание! Для того, чтобы маска заработала, ее необходимо определить явно при помощи setfacl. Иначе она будет «плавающей» и не будет выполнять свои функции.
Внимание! Маску всегда определяют самой последней, после указания прав доступа всех пользователей и групп.

Дело в том, что при внесении изменений в список acl, маска по умолчанию ставится такой, чтобы работали все установленные acl-ы. Т.е. не влияет на установленные права, становится «плавающей». Если вы не хотите, что бы маска изменялсь, используйте параметр -n (--no-mask), в этом случае маска изменяться не будет.

Если у файла установлены ACL, определение прав доступа происходит в том порядке, в котором они выводятся программой getfacl.

Программа setfacl предоставляет возможность скопировать ACL одного файла на другой файл. Для этих целей служит параметр --set-file. Например, необходимо скопировать списки доступа файла test в файл newtest. Тогда командная строка будет выглядеть следующим образом:

$ getfacl test | setfacl --set-file=- newtest
$ getfacl newtest
# file: newtest
# owner: artur
# group: users
user::rwx
user:user1:r-x                  #effective:r--
group::r--
group:bin:rwx                   #effective:rw-
mask::rw-
other::r--
$

Удаление элементов из списка ACL происходит при помощи параметра –x.

$ setfacl -x u:user1 test
$ getfacl test
# file: test
# owner: artur
# group: users
user::rwx
group::r--
group:bin:rwx
mask::rwx
other::r--
$

При выполнении этой команды пропала маска. Но об этой особенности я предупреждал Вас раньше.

Solaris

В Solaris команда на задание прав пользователю, например на чтение, работает так:

setfacl -m u:user1:r-- test

Ключевое отличие — наличие «—» — без указания «черточек» — не работает.