O primeiro comando alterará as permissões de qualquer arquivo / diretório pré-existente. O -d
comando 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 -R
comutador.
Em relação à -d
opção, na setfacl
pá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 setfacl
comando 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 -dR
comando 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 dir2
agora aplicará essas permissões nos arquivos dir2
també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--
app/cache
que contém um diretório chamadodev
, o primeiro comando será aplicado a ele, mas não o segundo? E se mais tarde for adicionado outro diretório (por exemploprod
), o segundo comando definirá as permissões? Se esse não for o caso, eu devo pular o segundo comando?-R
é um comando recursivo, portanto as permissões se aplicam. Os-d
guardas 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.