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