Visualizzazione post con etichetta script. Mostra tutti i post
Visualizzazione post con etichetta script. Mostra tutti i post

domenica 16 gennaio 2011

BASH: verifica possesso privilegi superuser

Può capitare di dover scrivere uno script per automatizzare operazioni che, del tutto o in parte, devono essere realizzate in qualità di superuser (superutente o utente root o amministratore). Se per semplificare vogliamo che l'intero script sia eseguito in modalità superuser può essere utile verificare, prima di dare il via alla sequenza di operazioni previste, se effettivamente l'utente che ha lanciato lo script possieda i privilegi di root. In altre parole si vuole verificare se lo script è stato lanciato dall'utente root o da un utente non-amministratore tramite il comando sudo (sui sistemi che lo prevedono).
Il seguente script offre un esempio di come realizzare la suddetta verifica.
  #!/bin/bash
if [ `id -u` -eq 0 ]; then
echo "Welcome My Lord"
exit 0
else
echo "Go away, miserable!"
exit 1
fi

Per un esempio più concreto, anche se molto semplice.
  #!/bin/bash
if [ `id -u` -eq 0 ]; then
rm -rf subdir
exit 0
else
echo "subdir not removed: insufficient priviliges"
exit 1
fi


Il principio di funzionamento è molto semplice: il comando id -u restituisce l'identificativo numerico relativo all'utente che ha lanciato lo script. L'identificativo dell'utente con privilegi di amministrazione è sempre 0, sia nel caso che si tratti dell'utente root in persona che di un utente semplice con l'ausilio di sudo.

NOTA: il simbolo ` non è un semplice apice e si ottiene premendo contemporaneamente AltGr e ' sulle tastiere con layout italiano(come qui).

sabato 2 ottobre 2010

BASH: verifica esistenza file o directory

Verifichiamo se il file temp.txt esiste:
 if [ -f temp.txt ]; then 
echo "temp.txt esiste."
else
echo "temp.txt NON esiste."
fi
Verifichiamo se la directory TEMP esiste, in caso negativo la creiamo:
 if [ -d TEMP ]; then 
echo "TEMP esiste."
else
mkdir TEMP
fi

Invertiamo if ed else:
 if [ ! -f temp.txt ]; then 
echo "temp.txt NON esiste."
else
echo "temp.txt esiste."
fi

if [ ! -d TEMP ]; then
mkdir TEMP
else
echo "TEMP esiste."
fi

Il seguente script completo verifica l'esistenza di un file passato come argomento:
 #!/bin/bash 

# verifica che il numero di argomenti dello script
# sia esattamente uno
if [ ${#} -ne 1 ] ; then
echo "Specificare il file da verficare."
exit 1
fi

if [ -f ${1} ]; then
echo "Il file esiste."
else
echo "Il file NON esiste."
fi

exit 0

mercoledì 19 maggio 2010

Errori inspiegabili eseguendo bash script

Su sistemi Ubuntu Linux può accadere di ricevere errori inspiegabili durante l'esecuzione di script bash. Provando ad eseguire il seguente script, ad esempio:
 #!/bin/bash 

#testall.sh

nets=( 0 1 2 3 4 5 6 7 8 9 10 11 12 13 16 17 )
jobs=( 32 25 28 18 10 50 33 12 13 11 11 14 18 14 13 13 )

# get length of array
length=${#nets[@]}

# use for loop read all test values
for (( i=0; i<${length}; ++i ));
do
echo net_${nets[$i]}
./main ${jobs[$i]} net_${nets[$i]}
echo -e "\n"
done

exit 0
Non è presente alcun errore, eppure sui sistemi sopra citati, quando si digita il seguente comando sh testall.sh si ottiene questo messaggio di errore
 testall.sh: 3: Syntax error: "(" unexpected 
il problema è veramente molto subdolo e, quindi, di difficile soluzione.

Come detto quello in questione è uno script bash, /bin/sh è un link simbolico che normalmente fa riferimento a /bin/bash e se così fosse tutto dovrebbe funzionare a dovere. Purtroppo spesso /bin/sh fa invece riferimento al programma /bin/dash, e quindi la sintassi non viene interpretata correttamente e si ottiene un errore.

Per risolvere è sufficiente
  • modificare il link simbolico /bin/sh in modo che punti a /bin/bash
o, in alternativa,
  • rendere i nostri script eseguibili e lanciarli come segue ./testall.sh in questo modo il corretto interprete sarà automaticamente selezionato all'avvio dello script.