>
MENU
cryptkeeper - step1

Cryptkeeper: proteggersi da occhi indiscreti su Ubuntu

Ps3 cell spe ray tracing capability

PS3: sfruttare il Cell con Linux

4 settembre 2007 Visualizzazioni: 190 Focus

Uso di SSH in ambienti distribuiti

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.

ssh.gif

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

twittergoogle_pluslinkedinmail
  • Malva

    Articolo interessante ma ci sarebbe stata bene anche una menzione di dsh, un utile tool che generalizza quello che proponi di fare tramite script shell e pacchettizzato nei repository ufficiali di alcune disitribuzioni Debian derivate. http://www.netfort.gr.jp/~dancer/software/dsh.html

    Malva