Avere padronanza della propria shell è uno dei requisiti fondamentali per poter agire in autonomia, semplicità e migliorare nel campo della sicurezza informatica.
Lo shell scripting consiste nella scrittura di script eseguibili tramite la shell per automatizzare compiti, creare batch jobs ed imparare ad utilizzare il proprio terminale nel pieno delle sue capacità.
Esistono diverse tipologie di Shell:
In questo articolo supporrò che si conosco i permessi di Linux e i comandi principali del terminale. Verranno introdotti diversi comandi, ma non tratterrò funzioni, sed e awk. Saranno trattati in seguito in quanto argomento avanzato (necessitano della conoscenza basilare dello shell scripting)
Non c’è bisogno di un programma speciale per scrivere uno script, basta VIM, geany o VI. Io utilizzerò quest’ultimo. Quando si crea uno script shell, bisogna specificare la shell che si sta utilizzando tramite la prima riga, con il comando
#!/bin/sh
Solitamente, il carattere # viene utilizzato per i commenti. Aggiungendo il ! riferisce quale shell, appunto, utilizzare per lo script. Il primo script sarà un semplice “Hello World”.
#!/bin/sh
# Questo è un commento
echo "\nCiao mondo!\n"
Per eseguirlo bisogna cambiare i permessi, eseguendo il comando
chmod 755 script.sh
La shell mantiene diverse variabili d’ambiente a cui possiamo accedervi ed utilizzarle durante i nostri script. Per vederle basta digitare il comando set
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $set
BASH=/bin/bash
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="11" [3]="1" [4]="release" [5]="i686-pc-linux-gnu")
HISTFILE=/home/mrtouch/.bash_history
HOME=/home/mrtouch
HOSTNAME=parrot
HOSTTYPE=i686
LANG=en_US.UTF-8
LINES=24
LOGNAME=mrtouch
...
Per quanto riguarda le variabili, uno script shell permette di definirle all’interno dello stesso. Sono case sensitive (nome sarà diverso da Nome), il tipo di dato viene determinato automaticamente dal sistema e per utilizzarle basta aggiungere il carattere **$**.
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $cat script.sh
#!/bin/sh
nome="Hacktips"
ore=$(date +"%T")
echo "Oggi alle $ore, $USER sta scrivendo un articolo per $nome"
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $./script.sh
Oggi alle 12:46:51, mrtouch sta scrivendo un articolo per Hacktips
Nel caso uno script non stampasse nulla, è possibile controllare se lo stesso è stato eseguito con successo oppure no. Linux possiede diversi codici di uscita per gli script, con i quali possiamo verificare lo buon uscita del nostro script.
Ad esempio, se digito date, il codice di uscita sarà 0, poichè il comando è stato eseguito correttamente.
Se invece digito boh, il codice sarà 127, in quanto il comando non esiste.
┌─[mrtouch@parrot]─[~]
└──╼ $date
Wed Feb 22 17:12:35 CET 2017
┌─[mrtouch@parrot]─[~]
└──╼ $echo $?
0
┌─[mrtouch@parrot]─[~]
└──╼ $boh
bash: boh: command not found
┌─[✗]─[mrtouch@parrot]─[~]
└──╼ $echo $?
127
La redirezione può essere eseguita sia per l’input sia per l’output.
Uno dei comandi più basilari per eseguirla è inviare comandi ad un file. Molto semplicemente:
Ad esempio
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $ls -l script.sh > file
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $cat file
-rwxr-xr-x 1 mrtouch mrtouch 29 Feb 22 12:57 script.sh
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $date >> file
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $cat file
-rwxr-xr-x 1 mrtouch mrtouch 29 Feb 22 12:57 script.sh
Wed Feb 22 13:00:11 CET 2017
Con la shell è ovviamente possibile scrivere espressioni matematiche. Nel caso dovessimo scrivere espressioni, il modo più semplice è quello di creare uno script, salvare le variabili ed eseguire i calcoli che ci servono.
Oltre alle semplici espressioni, è possibile usare if-then-else, cicli _for _e while. Come in qualsiasi altro linguaggio di programmazione, sta a noi decidere quale è più consono per la situazione.
Un paio di esempi
1.Verifica della presenza di file, cartelle ed esecuzione di alcuni comandi
#!/bin/sh
if USER=mrtouch
then
echo "Ciao mrtouch"
else
echo "Non ti conosco"
fi
dir=hs
if [ -d $dir ]
then
echo "Hs è una cartella"
cd $dir
ls -l
if [ -e Telecom.cap ]
then
echo "Ed è pure presente Telecom"
rm Telecom.cap
ls -l
echo "Ora non c'è più"
fi
fi
L’output sarà
Per comparare dei numeri, il codice corrispondente è:
Invece, per quanto riguarda la comparazione dei file
2.Stampare le parole di un file più lunghe di venti caratteri
#!/bin/sh
file="dictIT.txt"
for word in `cat $file`
do
if [ ${#word} -gt 20 ] #con ${#word} calcolo la lunghezza della stringa
then
echo $word
fi
done
Come già detto, in questo articolo ho voluto solo introdurre l’argomento. Come qualsiasi linguaggio di programmazione, anche bash necessita di esercizi e molta pratica per essere conosciuto a fondo. Per questo motivo, consiglio ShellScript.sh e tldp.org, due ottimi siti per potersi esercitare al meglio.