Cambiare i permessi ricorsivamente: differenze tra le versioni
mNessun oggetto della modifica |
(modifica per evitare di seguire i link simbolici) |
||
Riga 1: | Riga 1: | ||
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). | |||
{{Box|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. | |||
{{Box|Esempio| $ cd cartella/da/modificare/ | |||
$ chmodr g-wx g-w | |||
}} | |||
Ecco lo script: | |||
<pre> | |||
#!/bin/bash | |||
# | |||
# Antonio Ingargiola - 2004 | |||
# | |||
# chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory | |||
# | |||
# Cambia ricorsivamente i permessi di file e directory, ma impostando | |||
# permessi diversi per i file e per le directory | |||
# | |||
# USO | |||
# ^^^ | |||
# | |||
# chmodr | |||
# Senza parametri imposta ad un sano default tutti i file (640) e alle | |||
# directory (750) contenute nella directory corrente. | |||
# | |||
# 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 che simbolica. | |||
# | |||
help () { | |||
echo -e "\n Antonio Ingargiola - 2004\n" | |||
echo -e " chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory\n" | |||
echo -e " Cambia ricorsivamente i permessi di file e directory, ma impostando" | |||
echo -e " permessi diversi per i file e per le directory.\n" | |||
echo -e " USO" | |||
echo -e " ^^^\n" | |||
echo -e " chmodr" | |||
echo -e " Senza parametri imposta ad un sano default tutti i file (640) e alle " | |||
echo -e " directory (750) contenute nella directory corrente.\n" | |||
echo -e " chmodr permessi_file permessi_dir" | |||
echo -e " Applica ai file nella directory corrente e sotto-directory i " | |||
echo -e " 'permessi_file' e tutte le directory i 'permessi_dir'. La sintassi" | |||
echo -e " per i permessi e' la stessa di chmod quindi sia ottale che simbolica.\n" | |||
exit 1 | |||
} | |||
valid_mod () { | |||
# Check if the mods are syntactically correct | |||
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' sbagliato. 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 | |||
</pre> | |||
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. | |||
---- | ---- | ||
Autore: [[ | Autore: [[Utente:TheNoise|~ The_Noise]] | ||
[[Categoria: | [[Categoria:Sistema]] | ||
[[Categoria: | [[Categoria:Shell]] | ||
[[Categoria:Script]] | |||
[[Categoria:Tips&Tricks]] |
Versione delle 17:20, 7 set 2006
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.
Esempio $ cd cartella/da/modificare/ $ chmodr g-wx g-w |
Ecco lo script:
#!/bin/bash # # Antonio Ingargiola - 2004 # # chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory # # Cambia ricorsivamente i permessi di file e directory, ma impostando # permessi diversi per i file e per le directory # # USO # ^^^ # # chmodr # Senza parametri imposta ad un sano default tutti i file (640) e alle # directory (750) contenute nella directory corrente. # # 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 che simbolica. # help () { echo -e "\n Antonio Ingargiola - 2004\n" echo -e " chmodr - Un chmod Ricorsivo, che rispetta le differenze file-directory\n" echo -e " Cambia ricorsivamente i permessi di file e directory, ma impostando" echo -e " permessi diversi per i file e per le directory.\n" echo -e " USO" echo -e " ^^^\n" echo -e " chmodr" echo -e " Senza parametri imposta ad un sano default tutti i file (640) e alle " echo -e " directory (750) contenute nella directory corrente.\n" echo -e " chmodr permessi_file permessi_dir" echo -e " Applica ai file nella directory corrente e sotto-directory i " echo -e " 'permessi_file' e tutte le directory i 'permessi_dir'. La sintassi" echo -e " per i permessi e' la stessa di chmod quindi sia ottale che simbolica.\n" exit 1 } valid_mod () { # Check if the mods are syntactically correct 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' sbagliato. 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.
Autore: ~ The_Noise