PDA

Visualizza la versione completa : [BASH] controllare path


GreyFox86
07-07-2006, 15:41
In uno script ho necessità, fra le altre cose, di eliminare una cartella all'interno di un certo percorso.
Il nome della cartella nello specifico deve essere passata come parametro allo script, mentre la prima parte del percorso si trova già nello script come variabile.


elif [[ $1 = "d" ]]; then
if [[ ! -z $2 ]]; then
to_delete=${2%/}
echo "Are you sure to remove directotry $workdir/$to_delete?"
read answer
[...]
else
msg=1
fi
else

Il problema è che se il nome della cartella ($2) per errore o volontariamente fosse qualcosa del tipo "../../../qualcosa" allora il path farebbe riferimento ad una dir superiore a quella dove lo script dovrebbe operare. Nel caso venga eseguito da un utente normale al max potrebbe danneggiare solo le sue cartelle, ma se fosse root a farlo i danni potrebbero essere ingenti.
Vorrei evitare che lo script accettasse solo path effettivamente interni a $workdir. Quale è secondo voi la soluzione migliore?

GreyFox86
07-07-2006, 16:05
Avrei pensato di fare qualcosa del genere, che ne dite?


to_delete=${2//..\//} # QUI
to_delete=${to_delete%/}
if [[ ! -z $to_delete ]]; then

in modo da rimuovere tutte le occorrenze di "../" dalla stringa del path.

PS: devo ancora aggiungere una riga di controllo per verificare che il path risultante effettivamente esista prima di chiedere se si vuole procedere o meno.

/dev/null
07-07-2006, 16:34
Se vuoi pulire il path trovando quello effettivo, privo di ./ e ../ potresti fare qualcosa del tipo:

DIR=$PWD;
cd $PATH;
PATHPULITO=$PWD;
cd $DIR
o piu' semplicemente:

pushd $PATH;
PATHPULITO=$PWD;
popd

$PATH e' il percorso che vuoi pulire, $PATHPULITO conterra' il percorso ripulito da ./ e ../

fatto cio' ti basta controllare che $PATHPULITO inizi con $workdir

GreyFox86
07-07-2006, 17:39
Veramente spettacolare, gran bel metodo grazie, il mio era un po' :messner:

Per controllare che $PATHPULITO inizi per $workdir ho fatto così. Visto che esiste sempre un metodo migliore, posto il codice per avere eventuali suggerimenti :)

if [[ ! -z `expr match "$PATHPULITO" "\($workdir\)"` ]]; then

Loading