Cambiare i permessi ricorsivamente: differenze tra le versioni
m (piccole ristrutturazioni pagina) |
m (aggiunto motivo) |
||
(13 versioni intermedie di 7 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Da_cancellare|Sostituibile con l'esecuzione di un singolo chmod, si veda [[Discussione:Cambiare_i_permessi_ricorsivamente | qui]].}} | |||
{{Versioni compatibili}} | |||
__TOC__ | |||
== 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). | |||
{{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. Un terzo parametro opzionale indica una directory di partenza diversa da quella corrente.<br/> | |||
Ad esempio: | |||
<pre> | <pre> | ||
$ cd cartella/da/modificare/ | |||
$ chmodr g-wx g-w | |||
</pre> | </pre> | ||
In ultimo, il seguente comando: | |||
<pre> | <pre> | ||
$ | $ chmodr -h | ||
</pre> | </pre> | ||
mostra una schermata di help. | |||
== Script == | |||
Lo script: | |||
<pre> | |||
#!/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 è la stessa di chmod quindi sia ottale (es. 640) che | |||
simbolica (es. o-rwx). | |||
È 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 è 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' è 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> | </pre> | ||
Il core dell script (quello che esegue effettivamente il cambio dei permessi) è la parte finale, da <code>ls | while read ...</code> 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() | |||
{{Autori | |||
|Autore = [[Utente:TheNoise|~ The_Noise]] | |||
}} | |||
[[Categoria:Bash Scripting]] | |||
Versione attuale delle 10:42, 28 mag 2015
Attenzione. Questa guida è stata proposta per la cancellazione in quanto contenente materiale potenzialmente dannoso, inutile o fuorviante. Motivo: Sostituibile con l'esecuzione di un singolo chmod, si veda qui. |
Versioni Compatibili Tutte le versioni supportate di Debian |
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.
Ad esempio:
$ cd cartella/da/modificare/ $ chmodr g-wx g-w
In ultimo, il seguente comando:
$ chmodr -h
mostra una schermata di help.
Script
Lo 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 è la stessa di chmod quindi sia ottale (es. 640) che simbolica (es. o-rwx). È 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 è 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' è 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()
Guida scritta da: ~ The_Noise | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |