Come posso impostare le autorizzazioni in modo ricorsivo su una directory (con ACL abilitato)?


24

Ad esempio, voglio dare ai miei colleghi l'accesso in scrittura a determinate directory. Supponiamo che nelle sue sottodirectory siano presenti i diritti di accesso 775, i file 664 e anche alcuni file eseguibili nella directory dir - 775.

Ora voglio aggiungere i permessi di scrittura. Con chmod, ho potuto provare qualcosa del genere

chmod o+w -R mydir/

Ma non è bello, dal momento che non voglio rendere la directory scrivibile dal mondo - voglio dare accesso solo a determinati utenti, quindi voglio usare ACL. Ma esiste un modo semplice per impostare tali autorizzazioni? A mio avviso, devo affrontare almeno tre casi (dirs, file, file eseguibili) separatamente:

find -type d -exec setfacl -m u:colleague:rwx {} \;
find -type f -executable -exec setfacl -m u:colleague:rwx {} \;
find -type f \! -executable -exec setfacl -m u:colleague:rw {} \;

Sembra un sacco di righe di codice per un compito così semplice. Esiste un modo migliore?

Risposte:


40

setfaclha un'opzione ricorsiva ( -R) proprio come chmod:

  -R, --recursive
      Apply operations to all files and directories recursively. This
      option cannot be mixed with `--restore'.

consente inoltre l'uso dell'autorizzazione capital-x X, che significa:

  execute only if the file is a directory or already has
  execute permission for some user (X)

quindi fare quanto segue dovrebbe funzionare:

setfacl -R -m u:colleague:rwX .

(tutte le citazioni sono man setfaclper acl-2.2.52 come fornite con Debian)


4
setfacl non ha la bandiera '-R' in FreeBSD 9
Aaron C. de Bruyn

6
allora è positivo che l'OP abbia taggato la loro domanda come [linux]
umläute il

Perso quello. ;)
Aaron C. de Bruyn,

Questo si applica automaticamente ai nuovi file / cartelle creati successivamente?
Enigma,

Controlla la pagina man per la tua versione di setfacl. L'opzione -Xnon funziona come previsto in inclusa in setfacl 2.2.49.
phyatt,

5

Come accennato da umläute, il comando setfacl -Rcon la "X" maiuscola è la strada da percorrere, come:

setfacl -R -m u:colleague:rwX .

Tuttavia, per coloro che hanno bisogno di riapplicare ACL in modo ricorsivo (es. Come "riapplicare le autorizzazioni su sottodirectory" su Windows).

find . -mindepth 1 | xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')

Questo comando potrebbe essere diviso per evitare errori simili setfacl: foobar: Only directories can have default ACLs.

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

Si noti che la sintassi <( something )è Sostituzione processo , che è specifica per bash. Potrebbe essere necessario creare un file temporaneo se si utilizza un'altra shell.


0
for i in $(find /data -mindepth 0 -type d)
do setfacl -m  u:zabbix:r-x $i
    echo "ACL rules set for "$i
done


@muru Per curiosità, perché no?
Shadur,

L'intero commento è un link. Seguilo e scoprilo.
Muru,

Se vuoi seguire questo approccio usafind /data -mindepth 0 -type d -exec setfacl -m u:zabbix:r-X {} \;
sibaz il

1
Non usarlo. $(find /data -mindepth 0 -type d)non restituirà i risultati riga per riga, tamponerà tutti i risultati. Se c'è uno spazio in una riga, otterrai un record errato nella $ivariabile.
Gnought
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.