versione 1.2 - ott 2012
Scopo di questo breve sommario è fornire un promemoria
#debian lenny
deb http://archive.debian.org/debian/ lenny main
deb-src http://archive.debian.org/debian/ lenny main
# Security:
deb http://archive.debian.org/debian-security/ lenny/updates main
deb-src http://archive.debian.org/debian-security/ lenny/updates main
# Volatile:
deb http://archive.debian.org/debian-volatile lenny/volatile main
Elenco script di shell
Esempio 1
=========
Esempio di uno script scritto con awk per spostarein una maildir i messaggi tra varie cartelle in base alla data (anno)
Uso: ls -la /home/usr031/Maildir/cur | awk -f awk_script >mv.sh
Questo comando esegue ls -la, passa l'output in pipe ad awk, elabora il contenuto e ridirige l'out sul file mh.sh che contiene tutti i comandi per eseguire l'operazione che deve poi essere eseguita, previa verifica del contenuto di mv.sh, dalla shell
# awk_script
BEGIN {
TEST_2005 = "2005"
TEST_2006 = "2006"
}
{
if ( $8 == TEST_2005 ) {
print "mv /home/usr031/Maildir/cur/" $9 "
/home/usr031/Maildir/.Archivio2005/cur/" $9
} else {
if ( $8 == TEST_2006 ) {
print "mv /home/usr031/Maildir/cur/" $9
" /home/usr031/Maildir/.Archivio2006/cur/" $9
}
}}
Esempio 2
=========
Dato un file organizzato in colonne (come ad esempio una ridirezione di ls -la su file) con awk è possibile estrarre una o più colonne oppure cambiare l'ordine di stampa . Ad esempio il comando seguente estrae le terza colonna
awk {print $3} nomedelfile
questo comando prende la 3 colonna del file
Esempio
3
=========
ls -la | grep Oct| awk '{
print "mv " $9 " ../last/"$9}' >mv.sh
Questo comando consente elenca il direttorio, estrae tutti i file di
Ottobre, lo passa ad AWK che crea uno script per spostarli in un altro
direttorio
Negli script di shell e' possibile verificare il valore ritornato dalle funzioni mediante il comando if....fi.
if conditional
then
# do this if conditional
returns a zero ("true") status
one-or-more-commands
else
# do this if conditional
returns non-zero ("false") status
one-or-more-commands
fi
dove conditional può ovviamente essere il comando stesso: ad esempio rsync o tar. Attenzione.....ricordarsi il fi.
Se si vuole proseguire sulla stessa riga si deve usare il ; come indicatore di fine riga
if command; then command; else command; fi
si notil'uso del ; come fine riga
Si può assegnare prima un numero e poi una stringa ad una variabile. Per accedere al valore (contenuto) della variabile si deve anteporre il segno di $
Per assegnare una variabile usare caratteri maiuscoli senza lasciare spazi tra nome segno di uguale e valore ad esempio
MYVAR=5
MYVAR='cioccolatini'
Esempio di stringa racchiusa tra singolo apice....non interpretata
SALUTO='Buon giorno $USER !'
echo $SALUTO
Buon giorno $USER !
Esempio con stringa racchiusa tra doppio apice...interpretata
SALUTO="Buon giorno $USER !"
echo $SALUTO
Buon giorno utente_collegato !
Esempio di esportazione di una variabile di enviroment
export PATH=${PATH}:/usr/games
${PATH}. In realta, questo e il vero modo per riferirsi ad una variabile, in genere si preferisce la piu comoda forma $PATH, maquesta deve essere subito abbandonata quando si corre il rischio di incappare in ambiguita.
Esempio di assegnamento ad una variabile del risultato di un comando
HOSTNAME=$(hostname)
Come funziona: si assegna ad una variabile come valore
l'output di un comando. Il comando e' racchiuso all'interno di
$(...) che rappresenta per la Bash una sorta di variabile
temporanea in cui memorizzare il risultato visibile di un comando (std
out)
e
.Supponiamo di dovere effettuare una connessione ssh da host1 ad host2 (ad esempio mediante comandi batch) e di dovere quindi effettuare la connessione senza intervento dell'operatore. Si deve quindi evitare la richiesta della login.
Questo può essere fatto mediante lo scambio delle chiavi pubbliche. La chiave pubblica di host1 deve essere aggiunta alla lista delle chiavi conosciute di host2
utente@host1: scp /home/utente/.ssh/id_rsa.pub utente2@host2:/home/utente2
utente@host1: cat /home/utente2/id_rsa.pub >> /home/utente2/.ssh/authorized_keys
Se host1 non dispone della coppia di chiavi per l'utente queste devono essere generate con il comando:
utente@host1: ssh-keygen -b 2048 -t rsa
SSH permette di realizzare dei tunnel criptati, che permettono di trasportare sessioni TCP arbitrarie all'interno della connessione criptata, permettendo di proteggere da intercettazione protocolli non sicuri, o di aggirare limitazioni di routing.
Questa funzionalità è detta port forwarding, e permette di aprire una socket TCP sul client SSH (local port forwarding) o sul server (remote port forwarding). Le connessioni ricevute su questa porta vengono inoltrate dall'altro capo della connessione SSH, verso un host e una porta specificata.
Ad esempio, con questo comando ci si collega ad host1, inoltrando la porta 10022 della macchina in cui lanciamo il client ssh alla porta 22 di host2 attraverso un canale sicuro tra client e host1
utente@host1: ssh host2 -L 10022:host3:22
Mentre questa connessione è attiva, collegandosi alla porta 10022 del client si viene rediretti verso la porta 22 di host3. Con questo sistema attivo una tunnel ssh verso
Il port forwarding è utile ad esempio per fare assistenza remota a macchine prive di un sistema di gestione remota sicuro. È possibile creare un tunnel su di un SERVER SSH abbia abilitato il forwarding. Questo è normalmente possibile senza installare nessun pacchetto aggiuntivo.
Ad esempio, nel seguente scenario
CLIENT host1--[rete insicura]--> ssh server host2 --[rete sicura]--> TERZA MACCHINA host3
utente@host1: ssh host2 -L 3389:host3:3389
Se vogliamo utilizzare un desktop remoto su host3 basta che ci connettiamo al server ssh host2 includendo un tunnel tra una porta locale della macchina dove lavoriamo e la porta 3389 della TERZA MACCHINA. Dopo di che basterà avviare il client RDP e connettersi a localhost:(porta scelta).
Il client ssh locale stabilirà una connessione criptata con il server, creerà un tunnel all'interno di questa connessione criptata, ed invierà la connessione RDP su questo tunnel. Il server a sua volta stabilirà una normale sessione TCP con la terza macchina sulla porta richiesta.
Come risultato, il client RDP verrà messo in comunicazione con la terza macchina. La connessione tra ssh server e terza macchina non sarà criptata, per cui è opportuno che la comunicazione tra queste due macchine non sia a rischio di intercettazione. La terza macchina vedrà la connessione TCP provenire dal server ssh invece che dal client.
Volendo effettuare un backup tra due host è possibile utilizzare rsync per la copia del file da una macchina all'altra. http://samba.anu.edu.au/rsync Se si desidera effettuare la sincronizzazione in modo automatico, ad esempio schedulandola con il cron, è necessario come prima cosa impostare lo scambio delle chiavi di autenticazione per stabilire sessioni ssh senza richiesta di password. (vedi sopra)
Una volta scambiate le chiavi e risolto il meccanismo di autenticazione tra le due macchine è possibile pianificare lo script rsync
Esempio:
#!/bin/sh
# andrea sommaruga - 28 ottobre 2007
# -----------
# Nota su SSH
# -----------
#
# copio la chiave pubblica di host1 su host2
# utente@host1: scp /home/utente/.ssh/id_rsa.pub utente2@host2:/home/utente2
# aggiungo la chiave pubblica di host1 all'elenco chiavi autorizzate di host2
# utente@host1: cat /home/utente2/id_rsa.pub >> /home/utente2/.ssh/authorized_keys
#
# a questo punto host1 e' in grado di effettuare connessioni ssh su host2 senza password
# -------------
# note su rsync
# -------------
#
# il direttorio sorgente DEVE terminare con / mentre il direttorio destinazione NON DEVE terminare con /
# nomeutente@nomehost:percorso
#
# opzioni:
# --update -u evita di copiare i file non cambiati
# --archive -a riproduce fedelmente i permessi e le caratterstiche originali equivale a -rptDog
# -v verbose
# -e ssh utilizza ssh per il trasferimento
# --owner --group
--numeric-ids mantiene
utente gruppo e gid/uid numericamente uguali se rsync
èeguito da root
# --times riproduce la data di modifica corretta
# --dry-run esegue solo una simulazione
# --delete cancella orfani (da usare con simulazione e log su file)
# effettua l'aggiornamento
rsync -u -a -v -e ssh /opt/pub/commesse2/ 192.168.9.3:/opt/pub/commesse2 >/opt/pub/manutenzione/log/rsync.srvsoilold.log
# effettua una sola simulazione per vedere che cosa ci sarebbe da cancellare
rsync -u -a -v --dry-run --delete -e
ssh /opt/pub/commesse2/ 192.168.9.3:/opt/pub/commesse2
>/opt/pub/manutenzione/log/rsync-dacancellare.srvsoilold.log
# eof rsync.sh
leggi le note legali
ritorno alla home page del sito