setfacl: questi due comandi sono uguali?


10

Ho uno script di distribuzione (basato su capifony) che imposta le autorizzazioni su server specifici per un'installazione di Symfony2. Contiene i seguenti due comandi per eseguire questa operazione per diverse directory:

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

Questi due comandi sono sul sito di Symfony2 come un modo per correggere i permessi, tuttavia, sembravano sorprendentemente simili a me. Quindi ho dato un'occhiata alle manpage di setfacl, e da quello che ho potuto capire, il secondo comando fa esattamente quello che fa il primo con un'opzione aggiuntiva (che non capisco del tutto). La mia domanda è: la mia ipotesi è corretta? In tal caso, avrebbe lo stesso effetto se avessi rimosso il primo comando?

Risposte:


15

Il primo comando cambierà le autorizzazioni di tutti i file / directory preesistenti. Il -dsecondo comando è fondamentale per impostare le autorizzazioni predefinite in futuro per qualsiasi directory, che a sua volta fornirà un set predefinito di ACL per tutti i file all'interno di queste directory.

NOTA: in entrambi i casi i comandi verranno eseguiti in modo ricorsivo tramite l' -Rinterruttore.

Per quanto riguarda l' -dinterruttore, dalla setfaclpagina 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).

Questo estratto lo spiega anche abbastanza bene:

Esistono due tipi di ACL: accesso ACL e ACL predefiniti. Un ACL di accesso è l'elenco di controllo di accesso per un file o una directory specifici. Un ACL predefinito può essere associato solo a una directory; se un file all'interno della directory non ha un ACL di accesso, utilizza le regole dell'ACL predefinito per la directory. Gli ACL predefiniti sono opzionali.

Fonte: 8.2. Impostazione degli ACL di accesso .

Esempio

Di 'che ho questa struttura di directory.

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

2 directories, 3 files

Ora impostiamo le autorizzazioni usando il primo setfaclcomando nella tua domanda:

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

Che si traduce in quanto segue:

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

Senza il -dRcomando eseguito qui, le nuove directory non sarebbero coperte dai tuoi ACL:

$ mkdir dir2

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

Ma se rimuoviamo questa directory ed eseguiamo il setfacl -dR ...comando e ripetiamo l'operazione sopra:

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

Ora le autorizzazioni sembrano abbastanza diverse:

$ 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 ora la nostra directory appena creata prenderà queste autorizzazioni "predefinite":

$ 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

Avere queste autorizzazioni in atto dir2ora imporrà anche queste autorizzazioni sui file 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--

Ah, quindi solo per confermare, vuoi dire che se abbiamo la directory app/cacheche contiene una directory chiamata dev, il primo comando verrà applicato a quello, ma non il secondo? E se successivamente viene aggiunta un'altra directory (ad es. prod), Il secondo comando imposterà le autorizzazioni? Se questo non è il caso, dovrei essere in grado di saltare il secondo comando?
Hosh Sadiq,

1
@HoshSadiq: no -Rè un comando ricorsivo, quindi si applicano le autorizzazioni. Le -dguardie se qualcuno dovesse creare una directory o spostare successivamente una directory nella struttura in modo che anche questa ACL fosse applicata.
slm

È fantastico! Rende le cose molto più chiare :) Grazie!
Hosh Sadiq,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.