CHMOD - Applicazione di autorizzazioni diverse per file e directory


9

Ho cercato di ripulire i permessi su alcune scatole e ho cercato l'uomo chmod e tutta la documentazione su Internet che gestisco senza fortuna, quindi eccoci qui.

Fondamentalmente, ho una directory con molti sottodirectory e file - e vorrei impostare le seguenti autorizzazioni:

Per le directory: 770 (u + rwx, g + rwx, o-rwx)

Per i file: 660 (U + rw, g + rw, ax, o-rw)

Mi piacerebbe provare a farlo con un singolo chmod ricorsivo, se possibile, in modo da evitare di ricorrere attraverso ogni directory e impostare le autorizzazioni file per file.

Immagino che ci debba essere un modo per farlo senza scrivere una mia shell script, ma non sono riuscito a trovare nulla.

Apprezzo il vostro aiuto!

Risposte:


10

Trovo utile uno script poiché è spesso utile modificare sia le autorizzazioni di file che di directory in un colpo solo, e sono spesso collegate. 770 e 660 per le directory condivise su un file server, 755/644 per le directory del server web, ecc. Tengo uno script con la modalità più comunemente usata per quel tipo di server nel cestino di root / e faccio semplicemente la ricerca manuale quando il comune la modalità non si applica.

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac

Wow! Questo e 'esattamente quello che stavo cercando. Grazie mille!
Skone,

Ehi iPaulo - puoi spiegare per caso "$ ii" sulla riga "trova $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ ii ;;". Non sono sicuro di capire perché non è solo "find $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ i ;;" Grazie!
Skone,

20

Non c'è bisogno di script.

// Directory:

find . -type d -exec chmod XXX {} \;

// File:

find . -type f -exec chmod XXX {} \;

17

Nel tuo caso potrebbe non essere necessario essere così complicato come gli altri hanno capito (sebbene findsia davvero un buon strumento per questo genere di cose in generale). La differenza tra le modalità è il bit di esecuzione. Se nel caso in cui nessun file abbia già impostato il bit di esecuzione, è possibile farlo in un'unica chmodchiamata di , proprio come richiesto.

chmod -R u=rwX,g=rwX,o= FILE...

La chiave qui è la capitale X, che la pagina man spiega come

esegui / cerca solo se il file è una directory o ha già i permessi di esecuzione per alcuni utenti.

Pertanto, se i file non dispongono già del bit di esecuzione impostato, verranno impostati solo per le directory.


Questo è fantastico, ma molto più lungo della semplice scrittura di 777. Esiste una scorciatoia per -X?
Elliott B,

6

Ho scoperto che almeno per il mio caso d'uso, usare rsyncper copiare la directory su se stesso era molto più veloce che usare chmoddirettamente con un elenco di file da find.

rsync -rpt --chmod=D770,F660 . .

Se vuoi aggiungere chowna alla stessa operazione, rsyncpuoi farlo anche con l' --chown=user:groupopzione.


Ehi, questo in realtà è molto più veloce di chmod -R.
Epeli,

Molto più veloce di chmod. Ci sono degli svantaggi nell'usare rsync in questo modo? L'ho fatto molto e tutto sembra a posto.
slothbear

1

Pulito e semplice:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)

Approccio molto elegante.
user5336

3
forse, ma nota che questo funziona solo se i file non contengono spazi. Un approccio più "sicuro" èfind ... -exec chmod ... {} \;
isaaclw, il
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.