Product SiteDocumentation Site

59.8. Команда setfacl

Команда setfacl изменяет ACL к файлам или каталогам. В командной строке за последовательностью команд идет последовательность файлов (за которой, в свою очередь, также может идти последовательность команд и так далее).
Синтаксис:
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] <ФАЙЛ> …
setfacl --restore=file
Опции:
  • -b — удалить все разрешенные записи ACL;
  • -k — удалить ACL по умолчанию;
  • -n — не пересчитывать маску эффективных прав, обычно setfacl пересчитывает маску (кроме случая явного задания маски) для того, чтобы включить ее в максимальный набор прав доступа элементов, на которые воздействует маска (для всех групп и отдельных пользователей);
  • -d — применить ACL по умолчанию;
  • -R — для подкаталогов рекурсивно;
  • -L — переходить по символическим ссылкам на каталоги (имеет смысл только в сочетании с -R);
  • -P — не переходить по символическим ссылкам на каталоги (имеет смысл только в сочетании с -R);
  • -L — следовать по символическим ссылкам, даже если они не указаны в командной строке;
  • -P — не следовать по символическим ссылкам, даже если они указаны в командной строке;
  • --mask — пересчитать маску эффективных прав;
  • -m — изменить текущий ACL для файла;
  • -M — прочитать записи ACL для модификации из файла;
  • -x — удалить записи из ACL файла;
  • -X — прочитать записи ACL для удаления из файла;
  • --restore=file — восстановить резервную копию прав доступа, созданную командой getfacl –R или ей подобной. Все права доступа дерева каталогов восстанавливаются, используя этот механизм. В случае если вводимые данные содержат элементы для владельца или группы-владельца, и команда setfacl выполняется пользователем с именем root, то владелец и группа-владелец всех файлов также восстанавливаются. Эта опция не может использоваться совместно с другими опциями за исключением опции --test;
  • --set=acl — установить ACL для файла, заменив текущий ACL;
  • --set-file=file — прочитать записи ACL для установления из файла;
  • --test — режим тестирования (ACL не изменяются).
При использовании опций --set, -m и -x должны быть перечислены записи ACL в командной строке. Элементы ACL разделяются одинарными кавычками.
При чтении ACL из файла при помощи опций -set-file, -M и -X команда setfacl принимает множество элементов в формате вывода команды getfacl. В строке обычно содержится не больше одного элемента ACL.
Команда setfacl использует следующие форматы элементов ACL:
  • права доступа отдельного пользователя (если не задан UID, то права доступа владельца файла):
    [d[efault]:] [u[ser]:]uid [:perms]
    
  • права доступа отдельной группы (если не задан GID, то права доступа группы-владельца):
    [d[efault]:] g[roup]:gid [:perms]
    
  • маска эффективных прав:
    [d[efault]:] m[ask][:] [:perms]
    
  • права доступа всех остальных:
    [d[efault]:] o[ther][:] [:perms]
    
Элемент ACL является абсолютным, если он содержит поле perms и является относительным, если он включает один из модификаторов: «+» или «^». Абсолютные элементы могут использоваться в операциях установки или модификации ACL. Относительные элементы могут использоваться только в операции модификации ACL. Права доступа для отдельных пользователей, группы, не содержащие никаких полей после значений UID, GID (поле perms при этом отсутствует), используются только для удаления элементов.
Значения UID и GID задаются именем или числом. Поле perms может быть представлено комбинацией символов «r», «w», «x», «-» или цифр (0 — 7).
Изначально файлы и каталоги содержат только три базовых элемента ACL: для владельца, группы-владельца и всех остальных пользователей. Существует ряд правил, которые следует учитывать при установке прав доступа:
  • не могут быть удалены сразу три базовых элемента, должен присутствовать хотя бы один;
  • если ACL содержит права доступа для отдельного пользователя или группы, то ACL также должен содержать маску эффективных прав;
  • если ACL содержит какие-либо элементы ACL по умолчанию, то в последнем должны также присутствовать три базовых элемента (т. е. права доступа по умолчанию для владельца, группы-владельца и всех остальных);
  • если ACL по умолчанию содержит права доступа для всех отдельных пользователей или групп, то в ACL также должна присутствовать маска эффективных прав.
Для того чтобы помочь пользователю выполнять эти правила, команда setfacl создает права доступа, используя уже существующие, согласно следующим условиям:
  • если права доступа для отдельного пользователя или группы добавлены в ACL, а маски прав не существует, то создается маска с правами доступа группы-владельца;
  • если создан элемент ACL по умолчанию, а трех базовых элементов не было, тогда делается их копия и они добавляются в ACL по умолчанию;
  • если ACL по умолчанию содержит какие-либо права доступа для конкретных пользователя или группы и не содержит маску прав доступа по умолчанию, то при создании эта маска будет иметь те же права, что и группа по умолчанию.
Пример. Изменить разрешения для файла test.txt, принадлежащего пользователю liza и группе docs, так, чтобы:
  • пользователь ivan имел права на чтение и запись в этот файл;
  • пользователь misha не имел никаких прав на этот файл.
Исходные данные
$ ls -l test.txt
-rw-r-r-- 1 liza docs 8 янв 22 15:54 test.txt
$ getfacl test.txt
# file: test.txt
# owner: liza
# group: docs
user::rw-
group::r--
other::r--
Установить разрешения (от пользователя liza):
$ setfacl -m u:ivan:rw- test.txt
$ setfacl -m u:misha:--- test.txt
Просмотреть разрешения (от пользователя liza):
$ getfacl test.txt
# file: test.txt
# owner: liza
# group: docs
user::rw-
user:ivan:rw-
user:misha:---
group::r--
mask::rw-
other::r--

Примечание

Символ «+» (плюс) после прав доступа в выводе команды ls -l указывает на использование ACL:
$ ls -l test.txt
-rw-rw-r--+ 1 liza docs 8 янв 22 15:54 test.txt