setfacl: Esses dois comandos são os mesmos?

8

Eu tenho um script de implantação (baseado em capifony) que define as permissões 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 do Symfony2 como uma forma de corrigir as permissões, no entanto, eles pareciam muito semelhantes a mim. Então eu dei uma olhada nas páginas de manual para setfacl , e pelo que pude entender, o segundo comando faz exatamente o que o primeiro faz com uma opção adicional (que eu não entendo muito bem). Minha pergunta é, minha suposição é correta? Em caso afirmativo, teria o mesmo efeito se eu removesse o primeiro comando?

    
por Hosh Sadiq 29.05.2014 / 01:11

1 resposta

12

O primeiro comando irá alterar as permissões de quaisquer arquivos / diretórios pré-existentes. O -d no segundo comando é crítico para definir as permissões padrão daqui para frente para quaisquer diretórios, o que, por sua vez, fornecerá um conjunto padrão de ACLs para quaisquer arquivos dentro desses diretórios.

OBSERVAÇÃO: em ambos os casos, os comandos serão executados recursivamente por meio da opção -R .

Em relação à opção -d , na página setfacl man:

   -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:

There are two types of ACLs: access ACLs and default ACLs. An access ACL is the access control list for a specific file or directory. A default ACL can only be associated with a directory; if a file within the directory does not have an access ACL, it uses the rules of the default ACL for the directory. Default ACLs are optional.

Fonte: 8.2. Definir ACLs de acesso .

Exemplo

Digamos que eu tenha essa estrutura de diretórios.

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

2 directories, 3 files

Agora vamos definir as permissões usando o primeiro comando setfacl em 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 comando -dR executado aqui, os novos diretórios não seriam cobertos pelas 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 comando setfacl -dR ... e repetirmos a 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 selecionará 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 em dir2 agora também aplicará essas permissões em arquivos em dir2 :

$ 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--
    
por 29.05.2014 / 01:23