2009-02-24 13 views
91

Ho un sacco di script e applicazioni a esecuzione prolungata che memorizzano i risultati di output in una directory condivisa tra alcuni utenti. Vorrei un modo per assicurarmi che ogni file e directory creati con questa directory condivisa avessero automaticamente le autorizzazioni u=rwxg=rwxo=r.Impostazione delle autorizzazioni predefinite per i file e le sottodirectory appena creati in una directory in Linux?

So che potrei usare umask 006 in testa ai miei vari script, ma non mi piace questo approccio visto che molti utenti scrivono i propri script e potrebbero dimenticarsi di impostare gli stessi umask.

Voglio solo che il filesystem imposti i file e le directory appena creati con una certa autorizzazione se si trova in una determinata cartella. È possibile?

Aggiornamento: Io penso può essere fatto con POSIX ACLs, utilizzando la funzionalità di ACL di default, ma è tutto un po 'sopra la mia testa in questo momento. Se qualcuno può spiegare come usare gli ACL di default, probabilmente risponderebbe a questa domanda in modo soddisfacente.

+1

Gli ACL POSIX sono carini, tuttavia un buon 60% delle macchine rilevate non verrà attivato per determinati file system, a seconda della distribuzione. Ecco una buona introduzione ed esempio: http://www.suse.de/~agruen/acl/linux-acls/online/ –

+1

Vuoi dire lo stesso documento che ho linkato :) Non ho avuto un cambiamento per leggerlo ancora, ma grazie per la testa a testa sul problema della disponibilità. –

+1

Il collegamento nel commento di Tim Post sembra essere morto, ma grazie a Internet Archive, ho potuto visualizzarlo e verificare che http://www.vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html contenga lo stesso identico documento. Modificherò la domanda per aggiornare il link. – rmunn

risposta

70

Per ottenere diritto di proprietà, è possibile impostare il bit setuid gruppo sulla directory con

chmod g+rwxs dirname 

Questo farà in modo che i file creati nella directory sono di proprietà del gruppo. Dovresti quindi assicurarti che tutti vengano eseguiti con umask 002 o 007 o qualcosa del genere --- questo è il motivo per cui Debian e molti altri sistemi Linux sono configurati con gruppi per utente di default.

Non conosco un modo per forzare le autorizzazioni desiderate se l'umask dell'utente è troppo forte.

+20

Questo in realtà non fornisce una soluzione: chiede le autorizzazioni e non la proprietà e l'unico modo per farlo è [con ACL] (http://stackoverflow.com/a/13906099/165673) – Yarin

+2

"... make certo che tutti corrono con umask 002 o 007 o qualcosa del genere "- questo è un po 'esagerato .... Come si fa a fare Postfix, Dovecot, Clam e Spam Assassin? – jww

+1

Cosa fa la parte '+ s'? Grazie. –

4

È brutto, ma è possibile utilizzare il comando setfacl per ottenere esattamente ciò che si desidera.

Su un computer Solaris, ho un file che contiene gli ACL per utenti e gruppi. Purtroppo, è necessario elencare tutti gli utenti (almeno io non riuscivo a trovare un modo per fare questo lavoro altrimenti):

user::rwx 
user:user_a:rwx 
user:user_b:rwx 
... 
group::rwx 
mask:rwx 
other:r-x 
default:user:user_a:rwx 
default:user:user_b:rwx 
.... 
default:group::rwx 
default:user::rwx 
default:mask:rwx 
default:other:r-x 

un nome al file acl.lst e inserire il tuo nome utente reali invece di user_X .

È ora possibile impostare le ACL sulla directory eseguendo il comando seguente:

setfacl -f acl.lst /your/dir/here 
+0

puoi lasciare l'elenco degli utenti se sono tutti membri dello stesso gruppo e usare solo le autorizzazioni di gruppo? –

+0

Mi stavo ponendo la stessa domanda. È passato un po 'di tempo da quando ho deciso. Ma ogni volta che ottengo un nuovo utente (nello stesso gruppo degli altri), dimentico di aggiornare l'elenco e ricevo lamentele sul fatto che il nuovo utente non sia in grado di scrivere/eliminare file. Quindi la risposta è: no, non puoi. – innaM

54

Ecco come farlo utilizzando ACL predefiniti, almeno sotto Linux.

In primo luogo, è possibile che sia necessario abilitare il supporto ACL sul proprio file system. Se si utilizza ext4, è già abilitato. Altri filesystem (ad es., Ext3) devono essere montati con l'opzione acl. In tal caso, aggiungi l'opzione al tuo /etc/fstab.Ad esempio, se la directory si trova sul filesystem di root:

/dev/mapper/qz-root / ext3 errors=remount-ro,acl 0 1 

poi rimontare è:

mount -oremount/

Ora, utilizzare il seguente comando per impostare l'ACL di default:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory 

Tutti i nuovi file in /shared/directory dovrebbero ora ottenere le autorizzazioni desiderate. Naturalmente, dipende anche dall'applicazione che crea il file. Ad esempio, la maggior parte dei file non sarà eseguibile da nessuno dall'inizio (a seconda dell'argomento della modalità alla chiamata open (2) o creat (2)), proprio come quando si usa umask. Alcune utilità come cp, tar e rsync tenteranno di conservare le autorizzazioni dei file di origine che maschereranno l'ACL predefinito se il file di origine non era scrivibile in gruppo.

Spero che questo aiuti!

+0

Sembra che questo richieda ancora il corretto 'umask' per tutti gli utenti. =/http://unix.stackexchange.com/questions/71743/using-setfacl-to-allow-group-members-to-write-to-any-file-in-a-directory –

+1

@techtonik Come ho scritto, dipende dall'applicazione che crea il file. Ad esempio, se usi 'cp', proverà a copiare i permessi del file sorgente. Neanche 'umask' aiuta quando si usa' cp'. Ho visto lo stesso problema con 'tar'. Vedi [questa domanda] (http://serverfault.com/questions/183800/why-does-cp-not-respect-acls). – pelle

+0

@techtonik Ho aggiunto una frase su questo nella mia risposta ora. – pelle

2

nello script di shell (o .bashrc) si può usare somthing come:

umask 022

umask è un comando che determina le impostazioni di una maschera che controlla come i permessi dei file sono impostate per i file appena creati.

+0

Questo non è corretto perché umask limita le autorizzazioni che non può aggiungere permessi – ACV

Problemi correlati