Como defino permissões recursivamente em um diretório (com o ACL ativado)?

21

Por exemplo, quero que meus colegas escrevam acesso a determinado diretório. Vamos supor que os subdiretórios tivessem direitos de acesso 775, arquivos 664 e também que houvesse alguns arquivos executáveis no diretório - 775.

Agora quero adicionar permissões de gravação. Com chmod, eu poderia tentar algo como

chmod o+w -R mydir/

Mas isso não é legal, já que eu não quero tornar a dir mundialmente gravável - eu quero dar acesso apenas a certos usuários, então eu quero usar a ACL. Mas existe uma maneira fácil de definir essas permissões? A meu ver, preciso abordar pelo menos três casos (dirs, arquivos, arquivos executáveis) separadamente:

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 {} \;

Parece um monte de linhas de código para uma tarefa tão simples. Existe uma maneira melhor?

    
por Rogach 29.10.2013 / 09:22

3 respostas

33

setfacl tem uma opção recursiva ( -R ) como chmod :

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

também permite o uso da permissão capital-x X , o que significa:

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

então, o seguinte deve funcionar:

setfacl -R -m u:colleague:rwX .

(todas as citações são de man setfacl para acl-2.2.52 como fornecido com o Debian)

    
por 29.10.2013 / 09:47
3

Como mencionado por um membro, o comando setfacl -R com letra maiúscula "X" é o caminho a seguir, como:

setfacl -R -m u:colleague:rwX .

No entanto, para aqueles que precisam reaplicar a ACL recrusivamente (por exemplo, "reaplicar permissões em subdiretórios" à la Windows).

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

Esse comando pode ser dividido para evitar erros como 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/')

Observe que a sintaxe <( something ) é Substituição do processo , que é específica do bash. Você pode precisar criar um arquivo temporário se usar outro shell.

    
por 17.09.2014 / 14:33
-1
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done
    
por 24.02.2016 / 12:36