Comandi vari

versione 1.2 - ott 2012

Scopo di questo breve sommario è fornire un promemoria

Reposotory


Vecchia stabile: Debian Lenny

ATTENZIONE
Il supporto per Debian 5.0 "Lenny" è terminato il 6 febbraio 2012
 #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

Script

Elenco script di shell

awk 

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

shell - controllo valore di ritorno

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

shell - variabili negli script

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

SSH   

SSH - Autenticazione mediante scambio di chiavi

.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 - Tunnel criptato

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.

RSYNC

rsync - sincronizzazione tra due host

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