Bash Script: Cambiare i permessi ricorsivamente
Da Guide@Debianizzati.Org.
Descrizione
Questo script cambia ricorsivamente i permessi di file e directory, ma impostando permessi diversi per i file e per le directory. In tal modo si possono impostare con un solo comando i permessi di esecuzione di un'intera gerarchia di directory (in modo da potervi accedere) e contemporaneamente togliere il permesso di esecuzione a tutti i file ivi contenuti.
Basta posizionarsi nella cartella interessata e lanciare lo script. Se non viene usato nessun parametro verranno impostati dei sani default (640 per i file e 750 per le cartelle).
|
Esempio Un utilizzo tipico è quello di sanare i permessi di file copiati da cdrom, da partizioni windows, da chiavette usb formattate fat32 etc. |
I due parametri opzionali sono i permessi rispettivamente di file e cartelle nello stesso formato accettato da chmod. Un terzo parametro opzionale indica una directory di partenza diversa da quella corrente.
|
Esempio $ cd cartella/da/modificare/ $ chmodr g-wx g-w |
In ultimo, il seguente comando:
$ chmodr -h
mostra una schermata di help.
Script
#!/bin/bash
#
# chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory
#
# Copyright (C) 2004, 2006 - Antonio Ingargiola <debian@fastwebnet.it>
#
# Released under the GNU GENERAL PUBLIC LICENSE.
#
help () {
cat << EOF
chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory
Copyright (C) 2004, 2006 - Antonio Ingargiola <debian@fastwebnet.it>
Released under the GNU GENERAL PUBLIC LICENSE.
DESCRIZIONE
Cambia ricorsivamente i permessi di file e directory, ma impostando
permessi diversi per i file e per le directory. Nella ricorsione non
segue link simbolici a directory.
USO
chmodr
Senza parametri, partendo dalla directory corrente imposta i permessi
640 (- rw- r-- ---) a tutti i file e 750 (- rwx r-x ---) a tutte le
sotto-directory.
chmodr permessi_file permessi_dir
Applica ai file nella directory corrente e sotto-directory i
'permessi_file' e tutte le directory i 'permessi_dir'. La sintassi
per i permessi e' la stessa di chmod quindi sia ottale (es. 640) che
simbolica (es. o-rwx).
E' possibile specificare un terzo parametro opzionale che indica una
directory iniziale diversa da quella corrente.
EOF
exit 1
}
valid_mod () {
# Controlla che i permessi siano sintatticamente corretti
echo "$1" |\
perl -n -e 'if ($_ =~ /^[01234567]{3}$/) {exit 0}; exit 1'
ok_numerical=$?
echo "$1" |\
perl -n -e 'if ($_ =~ /^[ugoa]{0,3}[+-=]{1}[rwx]{1,3}$/) {exit 0}; exit 1'
ok_symbolical=$?
# echo "num $ok_numerical, sym $ok_symbolical" # DEBUG
[ "$ok_numerical" = 0 -o "$ok_symbolical" = 0 ]
return $?
}
[[ "$1" = -* ]] && help
FILE_MOD="$1"
DIR_MOD="$2"
BASE_DIR="$3"
[ -z "$1" ] && FILE_MOD="640"
[ -z "$2" ] && DIR_MOD="750"
[ -z "$3" ] && BASE_DIR="./"
cd "$BASE_DIR"
if !( valid_mod $FILE_MOD && valid_mod $DIR_MOD ); then
echo -e "\n ERRORE: Il formato dei permessi e' errato. Per i dettagli"
echo -e " vedere la pagina di manuale di chmod.\n"
exit 2
fi
ls | while read file; do
if [ -L "$file" ]; then
echo " ==>> '$file' e' un link simbolico, lo ignoro."
continue
elif [ -d "$file" ]; then
echo " Entro nella directory '$file'"
chmod u+rwx "$file" 2> /dev/null ||\
{ echo " Non ho i permessi per entrare in '$file'"; continue; }
cd "$file"; $0 $@; cd - > /dev/null
chmod $DIR_MOD "$file" && echo -e " Directory '$file' impostata.\n"
elif [ -f "$file" ]; then
echo -n " $file ... "
chmod $FILE_MOD "$file" && echo " [ OK ]"
else
echo " Ignoro '$file'."
fi
done
Il core dell script (quello che esegue effettivamente il cambio dei permessi) è la parte finale da ls | while read ... in poi. Tutta la parte precedente serve solo a controllare la correttezza dei parametri passati e a stampare una eventuale schermata di help.
Changelog
- Release iniziale
- Aggiunto un check esplicito per evitare di seguire i link simbolici
- Cambiato header e funzione help()
Autore: ~ The_Noise
Categorie: Sistema | Shell | Script | Tips&Tricks

