Como definir permissões recursivamente em um diretório (com a ACL ativada)?

24

Por exemplo, quero dar aos meus colegas acesso de gravação a determinado diretório. Vamos supor que os subdiretórios continham direitos de acesso 775, arquivos 664 e também havia alguns arquivos executáveis ​​no diretório - 775.

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

chmod o+w -R mydir/

Mas isso não é legal, já que não quero tornar o diretório gravável em todo o mundo - quero dar acesso apenas a certos usuários, então quero usar a ACL. Mas existe uma maneira fácil de definir essas permissões? Na minha opinião, preciso resolver pelo menos três casos (diretórios, 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?

Rogach
fonte

Respostas:

40

setfacltem 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 Xpermissão capital-x , o que significa:

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

fazendo o seguinte deve funcionar:

setfacl -R -m u:colleague:rwX .

(todas as citações são man setfaclpara acl-2.2.52 , como foi enviada com Debian)

umläute
fonte
4
setfacl não tem o sinalizador '-R' no FreeBSD 9
Aaron C. de Bruyn
6
então é bom que o OP tenha marcado a pergunta como [linux]
umläute
Perdeu isso. ;)
Aaron C. de Bruyn
Isso se aplica automaticamente a novos arquivos / pastas criados posteriormente?
Enigma
Verifique na página de manual sua versão do setfacl. A opção -Xnão funciona como esperado em incluído no setfacl 2.2.49.
Phyatt #
5

Conforme mencionado por umläute, o comando setfacl -Rcom "X" maiúsculo é o caminho a seguir, como:

setfacl -R -m u:colleague:rwX .

No entanto, para aqueles que precisam reaplicar a ACL de forma recruta (ou seja, como "reaplicar permissões em subdiretórios" no 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 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 de processo , específica para o bash. Pode ser necessário criar um arquivo temporário se você usar outro shell.

Franklin Piat
fonte
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
fonte
@ muru Por curiosidade, por que não?
Shadur
O comentário inteiro é um link. Siga-o e descubra.
muru
Se você quiser ir por esse uso abordagemfind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz
1
Não use isso. $(find /data -mindepth 0 -type d)não retornará resultados linha por linha, ele armazenará em buffer todos os resultados. Se houver um espaço em uma linha, você obterá um registro incorreto na $ivariável.
Gnought 13/03