setfacl: esses dois comandos são iguais?

10

Eu tenho um script de implantação (baseado no capifony) que define as permissões te em servidores específicos para uma instalação do Symfony2. Ele contém os dois comandos a seguir para fazer isso em vários diretórios:

setfacl -R -m u:www-data:rwx -m u:`whoami`:rwX app/cache
setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwX app/cache

Esses dois comandos estão no site Symfony2 como uma maneira de corrigir as permissões; no entanto, eles pareciam muito semelhantes a mim. Então, dei uma olhada nas páginas de manual setfacle, pelo que pude entender, o segundo comando faz exatamente o que o primeiro faz com uma opção adicional (que eu não entendo direito). Minha pergunta é: minha suposição está correta? Nesse caso, teria o mesmo efeito se eu removesse o primeiro comando?

Hosh Sadiq
fonte

Respostas:

15

O primeiro comando alterará as permissões de qualquer arquivo / diretório pré-existente. O -dcomando no segundo é fundamental para definir as permissões padrão a seguir para qualquer diretório, que, por sua vez, fornecerá um conjunto padrão de ACLs para todos os arquivos nesses diretórios.

NOTA: Nos dois casos, os comandos serão executados recursivamente por meio do -Rcomutador.

Em relação à -dopção, na setfaclpágina de manual:

   -d, --default
       All operations apply to the Default ACL. Regular ACL entries in the 
       input set are promoted to Default ACL entries. Default ACL  entries
       in the input set are discarded. (A warning is issued if that happens).

Este trecho também explica bastante bem:

Existem dois tipos de ACLs: acessar ACLs e ACLs padrão. Uma ACL de acesso é a lista de controle de acesso para um arquivo ou diretório específico. Uma ACL padrão pode ser associada apenas a um diretório; se um arquivo no diretório não tiver uma ACL de acesso, ele usará as regras da ACL padrão para o diretório. As ACLs padrão são opcionais.

Fonte: 8.2. Definindo ACLs de acesso .

Exemplo

Digamos que eu tenho essa estrutura de diretórios.

$ tree
.
|-- dir1
|   |-- dirA
|   |   `-- file1
|   `-- fileA
`-- file1

2 directories, 3 files

Agora vamos definir as permissões usando o primeiro setfaclcomando na sua pergunta:

$ setfacl -R -m u:saml:rwx -m u:samtest:rwX .

O que resulta no seguinte:

$ getfacl dir1/ file1
# file: dir1
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x

# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--

Sem o -dRcomando executado aqui, novos diretórios não seriam cobertos por suas ACLs:

$ mkdir dir2

$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
group::rwx
other::r-x

Mas se removermos este diretório e executarmos o setfacl -dR ...comando e repita esta operação acima:

$ rmdir dir2
$ setfacl -dR -m u:saml:rwx -m u:samtest:rwX .

Agora as permissões parecem bem diferentes:

$ getfacl dir1/ file1 
# file: dir1/
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--

E agora o nosso diretório recém-criado receberá essas permissões "padrão":

$ mkdir dir2

$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

Ter essas permissões em vigor dir2agora aplicará essas permissões nos arquivos dir2também:

$ touch dir2/fileA
$ getfacl dir2/fileA 
# file: dir2/fileA
# owner: saml
# group: saml
user::rw-
user:saml:rwx           #effective:rw-
user:samtest:rwx        #effective:rw-
group::rwx          #effective:rw-
mask::rw-
other::r--
slm
fonte
Ah, então, apenas para confirmar, você quer dizer que, se tivermos o diretório app/cacheque contém um diretório chamado dev, o primeiro comando será aplicado a ele, mas não o segundo? E se mais tarde for adicionado outro diretório (por exemplo prod), o segundo comando definirá as permissões? Se esse não for o caso, eu devo pular o segundo comando?
Hosh Sadiq 28/05
11
@HoshSadiq - não, -Ré um comando recursivo, portanto as permissões se aplicam. Os -dguardas se alguém criar um diretório ou mover algum diretório para a árvore posteriormente, para que ela também tenha essa ACL aplicada.
slm
Isso é ótimo! Torna as coisas muito mais claras :) Obrigado!
Hosh Sadiq