Як встановити дозволи на рекурсивному режимі на dir (з увімкненим ACL)?


24

Наприклад, я хочу надати колегам запис доступу до певного каталогу. Припустимо, що підкаталоги в ньому мали права доступу 775, файли 664, а також у dir - 775 було кілька виконуваних файлів.

Тепер я хочу додати дозволи на запис. З chmod я міг би спробувати щось подібне

chmod o+w -R mydir/

Але це не круто, тому що я не хочу робити dir у світі, що можна записати - я хочу надати доступ лише певним користувачам, тому хочу використовувати ACL. Але чи є простий спосіб встановити ці дозволи? Як я бачу, мені потрібно вирішити щонайменше три випадки (dirs, файли, виконувані файли) окремо:

find -type d -exec setfacl -m u:colleague:rwx {} \;
find -type f -executable -exec setfacl -m u:colleague:rwx {} \;
find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;

Здається, досить багато рядків коду для такого простого завдання. Чи є кращий спосіб?

Відповіді:


40

setfaclмає рекурсивний варіант ( -R) так само chmod:

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

він також дозволяє використовувати Xдозвіл з великої літери , що означає:

  execute only if the file is a directory or already has
  execute permission for some user (X)

тому слід робити наступне:

setfacl -R -m u:colleague:rwX .

(усі лапки поданоman setfacl для acl-2.2.52 , що постачаються з Debian)


4
У FreeBSD 9 у setfacl немає прапора '-R'
Аарон К. де Брюн

6
тоді добре, що ОП позначила їх питання як [linux]
umläute

Пропустив це. ;)
Аарон К. де Брюн

Чи автоматично це стосується нових файлів / папок, створених згодом?
Енігма

Перевірте сторінку чоловіка на свою версію setfacl. Опція -Xне працює, як очікувалося в включеному в setfacl 2.2.49.
фіат

5

Як згадував umläute, команда setfacl -Rз великого регістру "X" - це спосіб пройти, як:

setfacl -R -m u:colleague:rwX .

Однак для тих, кому потрібно повторно застосувати ACL рекругіально (наприклад, "повторно застосувати дозволи на підкаталоги" à la Windows).

find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')

Цю команду можна розбити, щоб уникнути помилок setfacl: foobar: Only directories can have default ACLs.

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

Зауважте, що синтаксис <( something )- це Process Substitution , характерний для bash. Можливо, вам доведеться створити тимчасовий файл, якщо ви використовуєте іншу оболонку.


0
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done


@muru З цікавості, чому б і ні?
Шадур

Весь коментар - посилання. Слідкуйте за цим і з’ясуйте.
муру

Якщо ви хочете скористатися цим підходом, використовуйтеfind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz

1
Не використовуйте. $(find /data -mindepth 0 -type d)не повертає результати рядок за рядком, він буде буферизувати всі результати. Якщо в рядку є пробіл, ви отримаєте неправильну запис у $iзмінній.
Gnought
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.