Como recursivamente aplico ACLs padrão de um diretório a seus descendentes?

5

Se eu tiver um diretório com entradas de ACL padrão atribuídas a ele, mas alguns ou todos os seus arquivos descendentes e subdiretórios tiverem ACLs de acesso ou padrão que não estejam de acordo com esses padrões, como recursivamente (re) aplicar esses entradas de ACL padrão para todos os descendentes? Existe uma qualificação. Desejo substituir totalmente todas as ACLs descendentes existentes exceto para o status de execução existente dos arquivos. A intenção é que todos os descendentes devem ter as ACLs que teriam se recém-criadas em sua localização atual.

Rogach perguntou "Como eu defino permissões recursivamente em um diretório (com o ACL ativado)?" mas era procurando adicionar uma entrada de ACL nova recursivamente em vez de (re) aplicar uma ACL padrão existente. Embora não tenha sido pedido por Rogach, a resposta de Franklin Piat a essa pergunta também oferece uma solução para minha pergunta, mas acredito Sua solução é falha. Piat sugere este par de comandos:

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/')

As falhas que eu quero corrigir:

  • A ACL de acesso do diretório atual está sendo propagada para descendentes em vez de sua ACL padrão, o que não é como eu entendo que as ACLs devem funcionar.
  • O bit de execução é limpo para todos os arquivos ( sed é ineficaz).
  • As políticas típicas do sudoer impedem que a substituição do processo funcione quando são necessários privilégios de root. Veja a opção "closefrom_override" para sudoers (5) .

Idealmente, eu também precisaria apenas de uma linha de comando para realizar essa tarefa.

    
por froage 02.10.2014 / 10:01

1 resposta

1

Eu criei essa solução feia e ineficiente, mas com certeza há uma maneira melhor:

( cd '/some/dir' && sudo find . -mindepth 1 -path './leave/alone' -prune -o \( -type d -exec bash -c 'getfacl -cd . | sed -nre "p;/^\$/!s/^/default:/p" | setfacl -bM - "{}"' \; \) -o \( -type f -exec bash -c 'getfacl -cd . | sed -re "/^#/!s/x\$/X/" | setfacl -bM - "{}"' \; \) )

Alguns comentários sobre essa monstruosidade:

  • Eu incluí uma exclusão de subdiretório para demonstrar esse requisito frequente.
  • O cd elimina a repetição propensa a erros do caminho do diretório de origem e os parênteses externos tornam essa alteração temporária.
  • O uso de bash é necessário porque "-exec" não permite pipelines. Também evita que '!' caractere invocando a substituição do histórico e resultando no infame erro "evento não encontrado".
  • Para os subdiretórios, devemos aplicar as ACLs de padrão como ACLs de acesso e ACLs padrão.
  • Para arquivos, devemos aplicar as ACLs padrão de origem como ACLs de acesso, mas não aplicar nenhuma ACL padrão se quisermos evitar os avisos de “Somente diretórios podem ter ACLs padrão” de setfacl .
  • Para arquivos, precisamos substituir as permissões 'x' das ACLs padrão de origem por 'X' para que não acabemos forçando todos arquivos a se tornarem executáveis. Essa solução também preserva o status executável dos arquivos existentes, mas somente porque usamos "-bM -" em vez de "--set-file = -" com setfacl .
  • Esta linha de comando é muito ineficiente porque não sei como usar “-exec ... +” ou xargs em vez de “-exec. .. \; ”.
  • Esta linha de comando funciona, mas lembre-se de que os arquivos descendentes obtêm ACLs que são efetivamente equivalentes, mas não tecnicamente equivalentes ao que ocorre quando se cria um novo arquivo descendente.

A "filosofia Unix" é fantástica, mas a tarefa que estou tentando realizar é necessária com muita frequência para exigir uma linha de comando tão pesada. Existe uma maneira melhor além de fazer lobby por recursos adicionais em setfacl ?

    
por 13.12.2017 / 22:11