Automatizzare l'amministrazione di sistema con ssh e scp
by Valentino R.
Ultimo Aggiornamento 22 Febbraio 2004


Premessa:


Se avete un grande numero di sistemi Linux/Unix da amministrare, avrete sicuramente bisogno di alcuni script che aiutino nell'automazione di alcuni processi. Avrete anche notato che nel lavoro di ogni giorno vi trovate a fare spesso le stesse cose su ogni sistema. Forse avrete pensato a un modo di automatizzare questi processi. Questo è vero in particolare per la manutenzione di un grande numero di macchine Linux/Unix configurate allo stesso modo. In questo articolo esporrò un sistema per farlo usando le utilities di ssh.

Introduzione


L'idea è di trovare un modo di copiare alcuni file dalla workstation su cui sto lavorando verso un certo numero di altre workstation o server, e in seguito eseguire alcuni comandi su quelle macchine, come installare qualche rpm o cambiare alcune opzioni di sistema. A volte avremo bisogno di eseguire alcuni comandi su quelle macchine per poi trasferirne i risultati verso la nostra postazione di lavoro.
Per seguire questo articolo avrete bisogno di alcune conoscenze di base della programmazione shell. Dovrete conoscere alcune utility di ssh, come ssh-keygen, ssh-add, ssh, scp o sftp. C'è una implementazione libera del protocollo SSH su Linux: OpenSSH, che contiene questi tool. Sono incluse anche le pagine man.

Perchè usare ssh?


La risposta è una domanda: perchè no? Si potrebbe usare rsh-rcp o telnet-ftp, ma non sarebbero la migliore scelta in un ambiente insicuro come Internet e forse anche una Intranet. Ssh fornisce comunicazioni crittate e sicure tra due host attraverso una rete insicura. Non descriverò le implicazioni di sicurezza riguardanti l'uso di questi tool.

Copiare file e directory con scp


Per copiare un file da una directory locale verso un computer remoto si può usare il seguente comando:

scp /path/to/the/file/file1 user@remote_host:/remotedir/newfile

In questo esempio il file con nome file1 viene copiato dalla directory locale all'host remoto (remote_host può essere il nome o l'IP della macchina remota), sotto /remotedir con il nuovo nome newfile. Vi verrà richiesta la password di 'user'. Se l'autenticazione ha successo e l'utente remoto ha i privilegi richiesti, il file viene copiato. Si può omettere il nome remoto del file. In questo caso il file viene copiato con lo stesso nome. Semplicemente, significa che si può rinominare un file durante la copia. Anche l'opposto e` possibile: si può copiare un file remoto sulla macchina locale:

scp user@remote_host:/remotedir/file /path/to/local/folder/newfile

C'è anche un'utile caratteristica di scp. Potete copiare ricorsivamente le directory con l'opzione '-r'.

scp -r user@remote_host:/remotedir .

Questo comando copia la directory 'remotedir' a tutte le sue sotto-directory e file dall'host remoto alla directory corrente con lo stesso nome.

Nota: Si assume che abbiate il daemon sshd attivo sulla macchina remota.

Login remoto con ssh


Al posto di rlogin o telnet si può usare un metodo più sicuro, ssh:

ssh erdal@lnx.elav-web.net

In base alla vostra configurazione, vi verrà richiesto di inserire una password o una frase chiave. Qui ci stiamo connettendo a un computer remoto lnx.elav-web.net con nome di utente remoto erdal. Il comando ssh ha un certo numero di opzioni che possono essere utilizzate in base alle vostre esigenze. Date un'occhiata alla pagina man di ssh.

Eseguire comandi con ssh


C'è la possibilità di eseguire comando sui computer remoti con ssh:

ssh erdal@lnx.elav-web.net df -H

È molto simile alla sintassi per il login remoto. l'unica differenza è dopo il nome di host remoto. Il comando (in questo caso 'df -H') viene passato per l'esecuzione alla macchina remota. L'output del comando viene mostrato sul terminale.

Connettersi a un computer remoto senza password


Invece di usare l'autenticazione tramite password, si può usare una coppia di chiavi (pubblica/privata). Dovete generare la vostra coppia di chiavi.
C'è il comando ssh-keygen che può essere utilizzato per generare chiavi per ssh:

ssh-keygen -b 1024 -t dsa

Vi verrà richiesto un nome per la chiave privata. Normalmente il nome della chiave pubblica è lo stesso della chiave privata con estensione '.pub'. Qui '-b 1024' è il numero di bit nella chiave da creare. Se non lo specificate verrà usato il valore di default. La '-t dsa' viene usata per specificare il tipo di chiave. I valori possibili sono 'rsa1' per il protocollo versione 1 e 'rsa' o 'dsa' per il protocollo versione 2. Io raccomando l'uso della versione 2 del protocollo SSH. Ma se avete dei server vecchi che supportano solo la versione 1, dovrete specificare '-t rsa1' e creare un altro paio di chiavi. Potete forzare ssh a usare il protocollo versione 1 o il protocollo versione 2 specificando rispettivamente '-1' o '-2'.
Per poter usare le vostre chiavi dovete installare la vostra chiave pubblica sulla macchina remota. Il contenuto del file della chiave pubblica dovrebbe essere copiato o accodato a $HOME/.ssh/authorized_keys o a $HOME/.ssh/authorized_ keys2 . Fate attenzione a non mischiare le chiavi per i diversi protocolli. authorized_keys viene usato per il protocollo versione 1. authorized_keys2 viene usato per la versione 2. Se avete installato correttamente la vostra chiave pubblica, la prossima volta che vi collegherete a quella macchina vi verrà richiesto di inserire la vostra password e, se la sbagliate, vi verrà chiesta la password del sistema remoto. Potete limitare l'accesso ai vostri sistemi al solo uso della chiave pubblica modificando il file di configurazione di sshd. Il nome del file è /etc/ssh/sshd_config e il parametro da modificare è 'PasswordAuthentication'. Cambiate il valore di questo parametro a no (PasswordAuthentication no) e fate ripartire sshd.
Fino a qui tutto a posto. Abbiamo un modo sicuro di copiare ed eseguire comandi su un sistema remoto. Ma per l'automazione di alcuni lavori non dovremmo digitare password. Altrimenti non potremmo automatizzare niente. Una soluzione potrebbe essere quella di scrivere la password in ogni script, che comunque non è una buona idea. La cosa migliore è di usare il key-agent per prendersi cura delle nostre password. ssh-agent è un programma che tiene le chiavi private usate per l'autenticazione con chiave pubblica. Dovreste lanciare un key-agent:

ssh-agent $BASH

# ============================================
# e aggiungere le vostre chiavi private usando
# ============================================

ssh-add .ssh/id_dsa

# ======================
#         oppure
# ======================

ssh-add .ssh/identity

id_dsa è il file di chiavi private DSA e identity è il file delle chiavi private RSA1. Questi sono i nomi di default dati durante la generazione delle chiavi con ssh-keygen. Naturalmente vi verrà chiesta la vostra password prima che ssh-add aggiunga le vostre chiavi a ssh-agent. Potete vedere quali chiavi sono state aggiunte con il seguente comando:

ssh-add -l

Ora, se vi connettete al server che ha la vostra chiave nel file delle autorizzazioni, verrete connessi senza dover scrivere niente! ssh-agent avrà cura di completare il processo di autenticazione.
Quando usate ssh-agent come descritto sopra, potete usarlo solo dal terminale da cui ssh-agent è stato lanciato. Se volete usare ssh-agent da tutti i terminali che aprite, c'è bisogno di un po' piu` di lavoro,. Ho scritto questo piccolo script per avviare l'agent

#!/bin/sh
#
# by Valentino R.
#

agent_info_file=~/.ssh/agent_info

if [ -f $agent_info_file ]; then
   echo "File Agent info : $agent_info_file già esiste."
   echo "Assicurarsi che non sia in esecuzione ssh-agent dopodichè cancella questo file."
   exit 1
fi

ssh-agent | head -2 > $agent_info_file
chmod 600 $agent_info_file
exit 0

Questo script controlla l'esistenza di un file chiamato agent_info nella home dell'utente dove vengono normalmente tenuti i file di ssh riguardanti l'utente. Nel nostro caso la directory è '.ssh/'. Se il file esiste l'utente viene avvisato della presenza del file e riceve un breve messaggio su ciò che può fare. Se l'utente non sta già usando ssh-agent deve cancellare il file e far ripartire lo script. Lo script lancia ssh-agent e salva le prime due righe di output nel file agent_info. Queste informazioni verranno poi usate dalle utility ssh. Quindi c'è una linea che cambia i permessi del file, in modo che solo il proprietario del file possa leggerci e scriverci.
Una volta che l'agent è in funzione potete aggiungervi chiavi. Ma prima di farlo dovete usare source sul file agent_info, in modo che i tool ssh sappiano dove trovare l'agent:

source ~/.ssh/agent_info or . ~/.ssh/agent_info

E aggiungete le vostre chiavi con ssh-add. Potete aggiungere le righe seguenti al vostro .bashrc, in modo da lanciare source su agent_info ogni volta che aprite un terminale:

if [ -f .ssh/agent_info ]; then
. .ssh/agent_info
fi

mappa - disclaimer
Elav-Web le tue soluzioni contattaci
Soluzioni Informatiche Soluzioni Informatiche
Sviluppo software WebBased.
Elav-Web la tua soluzione I partner di Elav-Web news dal mondo IT

Tutorial


Sei il visitatore n° dal 22 settembre 2003.

Valid robots.txt Valid robots.txt Valid HTML 4.01 Transitional Valid CSS!