Come impostare le autorizzazioni predefinite per i file spostati o copiati in una directory?


9

La mia domanda è simile a Come impostare le autorizzazioni di file predefinite su TUTTI i file appena creati in Linux - ma differisce in modi importanti:

Voglio che tutti i file creati (o copiati o spostati) in una determinata directory ereditino una serie di autorizzazioni predefinite che sono diverse da quelle predefinite del sistema.

Motivazione: La directory in questione è la "tramoggia di aspirazione" per un'applicazione. Gli utenti di un gruppo inseriscono i file nella directory e l'app (in esecuzione con un altro ID utente nello stesso gruppo) li prende e li elabora. Il problema è che il proprietario di ciascun file inserito nella directory è l'utente che lo ha inserito lì e le autorizzazioni sono impostate automaticamente su "rw-r - r--"; Voglio cambiarlo in "rw-rw ----". L'app che esegue l'assunzione non può farlo esplicitamente, perché l'id utente in cui è in esecuzione l'app non possiede il file in questione e le autorizzazioni predefinite non consentono all'app di modificare il file! Ovviamente, l'utente potrebbe fare un chmod dopo aver messo il file lì - ma voglio mantenere il "drop" da parte dell'utente il più semplice possibile. (Queste persone non sono alfabetizzate con Linux,

umask sembra troppo potente: non voglio impostare autorizzazioni predefinite per ogni file creato ovunque da questi utenti - solo quelli creati in (o inseriti in) questa directory.

Si prega di avvisare ... grazie!

Risposte:


5

È possibile utilizzare un ACL (elenco controllo accessi) per impostare le autorizzazioni predefinite per i file in una directory.

Da man 5 acl:

Se un ACL predefinito è associato a una directory, il parametro mode alle funzioni che creano oggetti file e l'ACL predefinito della directory vengono utilizzati per determinare l'ACL del nuovo oggetto:

  1. Il nuovo oggetto eredita l'ACL predefinito della directory contenente come ACL di accesso.

  2. Le voci ACL di accesso corrispondenti ai bit di autorizzazione del file vengono modificate in modo che non contengano autorizzazioni non contenute nelle autorizzazioni specificate dal parametro mode.

Per configurarlo (cambia dispositivo, directory, ecc., Di conseguenza):

Modifica il tuo /etc/fstabfile e aggiungi l' aclopzione mount.

/dev/mapper/star-home /home ext3  defaults,acl 0 2

Rimontare ( pagina man di Sambamount.cifs ) il filesystem riavviando o usando:

mount -o remount,acl /home

Assicurati di avere le utilità setfacle getfacl.

Imposta l'ACL predefinito nella directory (potrebbe anche essere necessario impostare l'ACL sui file esistenti):

$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections

Vedi il tutorial collegato per ulteriori informazioni.

Fonte: Tutorial Parte 1 e Parte 2

Riferimento: elenchi di controllo di accesso POSIX su Linux


Non penso che dovresti aggiungere aclun'opzione al mountcomando quando l'hai aggiunta /etc/fstab. Sarà ridondante e quando esegui il mountcomando nella tua risposta, otterrai un output come questo: /dev/vda1 on / type ext4 (rw,errors=remount-ro,acl,acl)(vedi acl,aclalla fine). Per favore, correggilo se non sbaglio.
its_me

1

Posso offrire una soluzione alternativa: crea una directory "drop" separata, esegui un minijob separato che corregge le autorizzazioni e quindi sposta i file nella directory dei dati dell'applicazione. Puoi usare incron per questo, quindi non ci sarebbe praticamente alcun ritardo notevole.


1

Posso pensare a quattro possibili metodi per farlo:

  • umask, che non desideri utilizzare
  • programma wrapper, che imposta umask dell'applicazione, non dell'utente
  • cron, come descritto da @Peter Eisentraut; find $HOME/intake -type f -exec chmod 660 {} \;, diversi sistemi hanno miglioramenti delle prestazioni su questo (come l' -exec+opzione)
  • impostazioni basate su directory, che richiedono un po 'di programmazione della shell, ma fondamentalmente la shell, impostando il prompt o chiamando cd, cambierebbe umask se c'è un file dot presente in quella directory (o possibilmente una directory antenata); per bash, PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND"sarebbe il più semplice.
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.