Как я рекурсивно устанавливаю разрешения для каталога (с включенным ACL)?

24

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

Теперь я хочу добавить разрешения на запись. С chmod я мог бы попробовать что-то вроде

chmod o+w -R mydir/

Но это не круто, так как я не хочу делать dir доступным для записи в мире - я хочу предоставить доступ только определенным пользователям, поэтому я хочу использовать ACL. Но есть ли простой способ установить эти разрешения? На мой взгляд, мне нужно рассмотреть как минимум три случая (каталоги, файлы, исполняемые файлы) отдельно:

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разрешение capital-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)

umläute
источник
4
У setfacl нет флага '-R' во FreeBSD 9
Аарон К. де Брюн
6
тогда хорошо, что ОП пометил их вопрос как [linux]
umläute
Пропустил это. ;)
Аарон С. де Брюн
Это автоматически применяется к новым файлам / папкам, созданным в дальнейшем?
Enigma
Проверьте страницу руководства для вашей версии setfacl. Опция -Xне работает, как ожидается, включена в setfacl 2.2.49.
phyatt
5

Как упоминалось umläute, команда setfacl -Rс заглавной буквой «X» - это путь, например:

setfacl -R -m u:colleague:rwX .

Тем не менее, для тех, кому нужно повторно применять ACL рекурсивно (то есть, например, «повторно применить разрешения для подкаталогов» в 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 )является Подстановкой процессов , который является специфичным для Баша. Вам может понадобиться создать временный файл, если вы используете другую оболочку.

Франклин Пиат
источник
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
shgurbanov
источник
@muru Из любопытства, почему бы и нет?
Шадур
Весь комментарий является ссылкой. Следуйте за ним и узнайте.
Муру
Если вы хотите идти этим использовать подходfind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz
1
Не используйте его. $(find /data -mindepth 0 -type d)не будет возвращать результаты построчно, он будет буферизовать результаты целиком. Если в строке есть пробел, вы получите неверную запись в $iпеременной.
Gnought