Chi deve gestire molti sistemi, si pensi ad un sistema distribuito piuttosto che ad un CED, cerca sempre dei modi per ottimizzare i tempi, soprattutto quando si tratta di noiosissime sequenze di comandi shell in cui l’80% del tempo lo si impiega solo per fare il login e logout dal sistema.
Un breve articolo di Martin Brown ci elenca quali sono alcuni vantaggi nell’uso, in casi come questo, di Secure Shell (SSH) (ma anche SCP o SFTP).
SSH utilizza la crittografia a chiave privata/pubblica per poter instaurare una connessione sicura verso host remoti. Con SSH è però anche possibile loggarsi all’host remoto evitando di digitare la password ogni volta: infatti basta che si copi la chiave pubblica del nostro host sorgente nell’host remoto, affinché la connessione avvenga in maniera corretta e sicura.
Questa procedura è molto utile quando bisogna eseguire da remoto i comandi appena citati o bisogna monitorare periodicamente molti sistemi, ma non siamo in grado di interagire per digitare la password (o le password) del sistema remoto, perché ad esempio, vogliamo che tutto giri in crontab.
Per implementare ciò, bisogna prima creare una coppia di chiavi dal computer sorgente, seguendo le istruzioni e senza digitare la password con il comando seguente:
$ ssh-keygen -t rsa
Così otterremo una chiave pubblica da aggiungere nel file .ssh/id_rsa.pub nel terminale sorgente e nel file .ssh/authorized_keys di ciascun terminale remoto nella cartella home dell’utente con la quale ci si collega. Fatto questo, siamo in grado di eseguire sul terminale remoto un comando o una sequenza di comandi separti da “;”:
$ ssh cosmos@remote "df;uptime”
Bisogna porre attenzione che lo standard input e standard output, che vengono impattati quando si utilizzano questi comandi, sono replicati sul terminale sorgente. Il che significa che con i due comandi successivi otteniamo lo stesso risultato:
$ ssh root@remote "cat /var/log/messages|grep 'su['"
$ ssh root@remote "cat /var/log/messages" | grep 'su['
Si faccia attenzione alle virgolette: nel primo caso il grep è eseguito sull’host remoto mentre nel secondo, sull’host locale. Peccato che non è semplice utilizzare programmi interattivi come vim o Emacs anche se tale problema potrebbe essere ovviato usando un pseudo-tty.
Ma il compito che ci eravamo prefissati all’inizio era quello di inviare programmi a più host; bene, niente di complicato: in questo caso non facciamo altro che eseguire un piccolo script bash con un for, che gestisce la connessione e l’esecuzione di comandi verso più terminali usando la sintassi vista precedentemente. Eccone uno stralcio di esempio:
for j in 0 1 2 3 4 5
do
ssh cosmos@remote${j} "df;uptime”
done
Questo comando può essere eseguito sia all’interno di uno script sia da linea di comando direttamente. Se, per qualsiasi motivo, si volesse avere la (quasi) contemporaneità di esecuzione del comando verso i vari server, basta mandare in background il comando sulla macchina locale e sincronizzare la fine con il comando wait:
for j in 0 1 2 3 4 5
do
ssh cosmos@remote${j} "df;uptime” > /tmp/uptime_remote${j}.log
done
//synchronize the end of all task
wait
cat �?/tmp/uptime_remote*.log’
In questo modo, anche quando siamo in ferie, possiamo monitorare i nostri sistemi.
di Cosmos Puglisi - Programmazione.it