Cambiare i permessi ricorsivamente: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
mNessun oggetto della modifica
(modifica per evitare di seguire i link simbolici)
Riga 1: Riga 1:
=Premessa=
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.
A volte si ha la necessit� o il desiderio di poter sfruttare un kernel della serie 2.6.x sulla versione Woody (la stable al momento in cui scrivo).
Niente di pi� facile usando i backports!


=Preparare il sistema=
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).
Editiamo il nostro '''/etc/apt/sources.list''' e aggingiamo la riga:
<pre>deb http://www.backports.org/debian woody kernel-2.6</pre>
che mette a disposizioni i nuovi pacchetti '''modutils''', '''module-init-tools''' e '''sysfsutils'''.


=Scegliere il kernel=
{{Box|Esempio|Un utilizzo tipico è quello di sanare i permessi di file copiati da cdrom, da partizioni windows, da chiavette usb formattate fat32 etc. }}
A questo punto � necessario indicare esplicitamente nel sources.list il pacchetto che vogliamo utilizzare per il nuovo kernel. Questo pu� essere l' immagine di un kernel o i sorgenti di un kernel debianizzato a scelta tra quelli disponibili nei [http://www.backports.org/debian/dists/stable Backports]
e costruendo una riga del sources.list cos� fatta:
<pre>deb http://www.backports.org/debian woody nome_directory</pre>


=Installazione=
A questo punto sono sufficienti i classici:
<pre># apt-get update
# apt-get upgrade</pre>
per poter sfruttare la nuova serie di kernels.


{{box|Nota Bene:|In alternativa ai kernels debianizzati disponibili su Backports.org, � anche possibile utilizzare i sorgenti ufficiali 'vanilla', a patto di aver seguito il punto "'''Preparare il sistema'''"}}
I due parametri opzionali sono i permessi rispettivamente di file e cartelle nello stesso formato accettato da chmod.


=Conclusioni=
{{Box|Esempio| $ cd cartella/da/modificare/
Solo una piccola precisazione per finire: alcuni programmi/demoni/tools installati sul sistema potrebbero mostrare anomalie, una volta installato un kernel della serie 2.6.x: questo perch� fanno ricorso a funzioni non pi� disponibili o disponibili sotto nomi diversi rispetto ai kernels 2.4.x. Chi scrive ha ad esempio notato questo comportamento nei pacchetti "snmp" e "snmpd".<br>
$ chmodr g-wx g-w
In questa situazione si deve disinstallare il pacchetto "ribelle" e provveredere ad installarne la versione aggiornata sfruttando i backports (se disponibili), i sorgenti aggiornati o un repository debian alternativo.
}}


Happy hacking!
 
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: [[User:Keltik|Keltik]]
Autore: [[Utente:TheNoise|~ The_Noise]]


[[Categoria:Kernel]]
[[Categoria:Sistema]]
[[Categoria:Old]]
[[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).

Info.png 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.

Info.png 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