<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nerdsopolis &#187; ssh</title>
	<atom:link href="http://www.nerdsopolis.net/wp/tag/ssh/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nerdsopolis.net/wp</link>
	<description>Klaatu barada nikto!</description>
	<lastBuildDate>Wed, 18 Jan 2012 11:14:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Backup perfetti con rsync e ssh</title>
		<link>http://www.nerdsopolis.net/wp/2009/10/02/backup-perfetti-con-rsync-e-ssh/</link>
		<comments>http://www.nerdsopolis.net/wp/2009/10/02/backup-perfetti-con-rsync-e-ssh/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 13:31:02 +0000</pubDate>
		<dc:creator>fry</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tar]]></category>

		<guid isPermaLink="false">http://www.nerdsopolis.net/wp/?p=2021</guid>
		<description><![CDATA[Recentemente ho scoperto il potere occulto di rsync! Che la bash (o console) sia un luogo magico, terra fertile per il proliferare di nerd, geek e folletti&#8230; beh è cosa risaputa (con mastercard). Che esse-esse-acc-arsi * su di un server remoto per salvare files importantissimi sia una emozione unica&#8230; beh anche questo è cosa risaputa [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Recentemente ho scoperto il potere occulto di rsync!</strong></p>
<p>Che la bash (o console) sia un luogo magico, terra fertile per il proliferare di nerd, geek e folletti&#8230; beh è cosa risaputa (con mastercard).</p>
<p>Che <em>esse-esse-acc-arsi *</em> su di un server remoto per salvare files importantissimi sia una emozione unica&#8230; beh anche questo è cosa risaputa (con mastercard).</p>
<p><strong>Ma controllare che ogni giorno, ogni ora, il proprio script si occupi in maniera veloce e leggera di fare i backup&#8230; non ha prezzo!</strong></p>
<p>(*) ovvero aprire una shell sicura ** su di una macchina remota con ssh</p>
<p>(**) no, non è una pratica sessuale</p>
<p>Ok, veniamo al succo: <strong>due server</strong>. Uno principale su cui gli utenti salvano i loro files (magari attraverso samba) ed uno secondario, di backup, che è il clone del primo. Lo scopo è semplice, <strong>se il primo server salta, il secondo lo può sostituire all&#8217;istante.</strong> In più sul secondo server si possono eseguire operazioni di backup o altro, senza occupare risorse del primo, che così rimane tutto a disposizione degli utenti.</p>
<p><span id="more-2021"></span></p>
<p>Per fare questo abbiamo bisogno di 4 cose:</p>
<ol>
<li>uno script che <strong>sicronizzi</strong> i due server (rsync)</li>
<li>una <strong>sessione autenticata</strong> in ssh che permetta la sincronizzazione in maniera automatica</li>
<li><strong>l&#8217;esecuzione automatica</strong> ad un orario prestabilito dello script</li>
<li>uno script che faccia i <strong>backup</strong> (anch&#8217;esso ad orari prestabiliti)</li>
</ol>
<p>Cominciamo dal primo server (quello principale) che chiameremo server1.</p>
<h2>Punto 1: Rsync</h2>
<p>Il comando rsync è molto utile poichè <strong>permette la sincronizzazione di due directory</strong> tramite il confronto dei files e la copia esclusivamente dei cambiamenti tra le due cartelle. In pratica è come eseguire un scp (secure copy) tra due cartelle, ma con un notevole risparmio di banda dato che solo le modifiche vengono trasmesse (trasferimento  incrementale).</p>
<pre class="brush:bash">rsync --delete -azv -e ssh [dir1] [dir2]</pre>
<p>Dove naturalmente <strong>[dir1]</strong> e <strong>[dir2]</strong> sono le due cartelle da tenere &#8220;clonate&#8221;, con &#8220;&#8211;delete&#8221; vengono anche eliminati i files che sono stati cancellati dalla [dir1] e con &#8220;ssh&#8221; gli diciamo di utilizzare una sessione in ssh&#8230; appunto.</p>
<p>Per specificare che la [dir2] è remota si usa la sintassi:</p>
<pre class="brush:bash">utente@macchina:cartella</pre>
<p>Bene, vediamo adesso lo <strong>script</strong> nel suo insieme:</p>
<pre class="brush:python">#!/bin/sh

#Author: fry@nerdsopolis.net
#Description: Backup tramite rsync.

#Variabili
LOCAL=/srv/samba/pub
REMOTE=/srv/samba/backup
HOST=192.168.1.100
LOG=/srv/samba/backup.log
SYNCLOG=/srv/samba/backup.synclog

#Inizio log
echo $(date +"%d/%m/%Y") | cat &gt;&gt; $LOG
echo $(date +"%H:%M.%S") backup started... | cat &gt;&gt; $LOG

#Rsync
rsync --delete -azv -e ssh $LOCAL root@$HOST:$REMOTE | cat &gt; $SYNCLOG

#Fine log
echo $(date +"%H:%M.%S") backup ended! | cat &gt;&gt; $LOG</pre>
<p>Come si può vedere non ho fatto altro che specificare un po&#8217; di variabili ed aggiungere un file di log che ci permette di fare del debug sull&#8217;esecuzione di rsync.</p>
<p>La cartella locale è <em>/srv/samba/pub</em> e quella remota è <em>/srv/samba/backup</em> sul server2 che ha indirizzo <em>192.168.1.100</em>.</p>
<p>NB: lo script utilizza l&#8217;utente root su entrambi i server. <strong>Naturalmente tale opzione è sconsigliabile</strong> ma per il momento semplifica le cose!</p>
<p>Mettiamo lo script (che io ho chiamato semplicemente rsync_backup.sh) nella cartella</p>
<pre class="brush:bash">/usr/local/bin</pre>
<p>su server1 e rendiamolo avviabile</p>
<pre class="brush:bash">chmod u+x /usr/local/bin/rsync_backup.sh</pre>
<p>Ora se proviamo ad avviarlo</p>
<pre class="brush:bash">sh /usr/local/bin/rsync_backup.sh</pre>
<p><strong>ci verrà richiesta la password</strong> dell&#8217;utente root sul server2 (ed anche si accettare la chiave se è la prima volta che ci connettiamo in ssh a quella macchina).</p>
<p>Poichè però il nostro script dovrà essere eseguito automaticamente, <strong>non possiamo inserire a mano la password tutte le volte.</strong> E, prima che a qualcuno venga in mente, non vogliamo neanche far passare password in chiaro tutte le volte!</p>
<h2>Punto 2: SSH senza password</h2>
<p>Per automatizzare l&#8217;operazione di ssh tra il server1 ed il server2 dobbiamo fare in modo che il server2 si &#8220;fidi ciecamente&#8221; del server1 senza bisogno di una password. Come? <strong>Utilizzando una combinazione di chiavi pubbliche e private.</strong></p>
<p>Senza scendere nel dettaglio mi limiterò a ricordarvi (dato che voi già lo sapete) che posso distribuire liberamente la mia chiave pubblica e tenere al sicuro la mia chiave privata. Grazie alla chiave pubblica chiunque potrà essere sicuro della mia identità fin tanto che deterrò la chiave privata.</p>
<p>Sul <strong>server1</strong> generiamo la coppia di chiavi</p>
<pre class="brush:bash">ssh-keygen -t rsa</pre>
<p>lasciando generare le chiavi nella directory predefinita e non inserendo nessuna password quando ci viene chiesto.</p>
<p>Ora andiamo nella cartella <em>.ssh/</em> <strong>nella home del nostro utente</strong>, troveremo due files: <em>id_rsa</em> e <em>id_rsa.pub</em>.</p>
<p>Ovvero: <span style="color: #ff0000;">id_rsa = chiave privata</span> &amp; <span style="color: #00ff00;">id_rsa.pub = chiave pubblica</span></p>
<p><strong>Inviamo</strong> la nostra chiave pubblica al <strong>server2</strong></p>
<pre class="brush:bash">scp id_rsa.pub root@192.168.1.100:/root</pre>
<p>ora andiamo sul server2 nella cartella <em>/root</em> dove troviamo il file che abbiamo appena copiato. Adesso controlliamo di avere una cartella che si chiama &#8220;.ssh&#8221;, se non c&#8217;è creiamola. <strong>Poi mettiamo la chiave pubblica nel file &#8220;autorized_keys&#8221;</strong> all&#8217;interno della directory.</p>
<pre class="brush:python">mv id_rsa.pub .ssh/
cat id_rsa.pub &gt;&gt; authorized_keys
chmod 644 authorized_keys</pre>
<p>Ok! Adesso <strong>qualsiasi accesso in ssh dal server1 al server2 avverrà senza richiesta di password</strong> e quindi se proviamo a lanciare nuovamente il nostro script dal server1, la sincronizzazione avverrà senza richiesta di input.</p>
<p>NB. Come detto prima, eseguire queste operazioni con l&#8217;utente root è altissimamente sconsigliato!</p>
<h2>Punto 3: Crontab</h2>
<p>Crontab gestisce tutte le operazioni pianificate sul nostro server. L&#8217;utilizzo è semplicissimo:</p>
<pre class="brush:bash">0 4 * * * /usr/local/bin/rsync_backup.sh</pre>
<p>esegue il nostro script alle 4:00 di tutti i giorni.</p>
<p>Per maggiori dettagli su crontab vi rimando a <a href="http://it.wikipedia.org/wiki/Crontab">wikipedia</a>.</p>
<p>La stringa che abbiamo visto sopra <strong>andrà inserita all&#8217;interno della coda di crontab</strong>, tramite il comando</p>
<pre class="brush:bash">crontab -e</pre>
<p>si aprirà un editor (se è la prima volta ci chiede anche che editor usare, io consiglio <strong>vim</strong>) dove scrivere la stringa (in vim per modificare si preme &#8220;i&#8221;) e dopo averla salvata (premere &#8220;:x&#8221;) possiamo controllare che sia stata inserita tramite</p>
<pre class="brush:bash">crontab -l</pre>
<h2>Punto 4: Backup</h2>
<p>Mentre il nostro server1 si becca tutti gli accessi degli utenti, il <strong>server2 rimane dormiente tutto il giorno</strong> e viene utilizzato solo per qualche minuto verso le 4 di notte, quando riceve gli aggiornamenti.</p>
<p>Possiamo quindi pianificare su server2 in qualsiasi altro momento della giornata dei <strong>backup</strong> (totali o incrementali) da masterizzare o da copiare su altri dischi.</p>
<p>Ecco lo script che uso io (backup totali tramite tar)</p>
<pre class="brush:python">#!/bin/sh

#Author: fry@nerdsopolis.net
#Description: Script per la creazione di backup automatico e rimozione
#             vecchi backup.

#Variabili
LOG=/srv/samba/backup.log
TARLOG=/srv/samba/backup.tarlog
BASE=/srv/samba/backup/
DIR=pub/

#Inizio log
echo $(date +"%d/%m/%Y") | cat &gt;&gt; $LOG
echo $(date +"%H:%M.%S") backup started... | cat &gt;&gt; $LOG

#Creazione del backup
cd $BASE
tar -zcvf $(date +"%y%m%d-%H%M").tar $DIR | cat &gt; $TARLOG

#Eliminazione backup piu' vecchio
first=$(ls | grep tar | sort -n | head -1)
rm $first
echo $(date +"%H:%M.%S") deleted $first | cat &gt;&gt; $LOG

#Fine log
echo $(date +"%H:%M.%S") backup ended! | cat &gt;&gt; $LOG</pre>
<p>In questo caso il mio script crea un archivio tar compresso di tutta la cartella <em>/srv/samba/backup/pub</em> e <strong>successivamente cancella il backup più vecchio.</strong></p>
<p>Naturalmente questa tecnica ci consente di tenere in memoria (a seconda dello spazio sul disco) tanti backup che sono la &#8220;foto&#8221; della cartella in un determinato momento. Se ad esempio tengo 10 backup, lo script andrà a crearne uno nuovo e poi a cancellare il più vecchio, lasciandone sempre 10 sul mio disco. Per fare ciò però <strong>dovremo ricordarci di fargli fare prima 10 backup commentando per i primi 10 cicli la riga relativa alla cancellazione dei backup più vecchi.</strong></p>
<p>Anche questo script, come il precendete va messo in <em>/usr/local/bin</em> e chmoddato in modo da essere eseguibile.</p>
<p>Ora sempre tramite crontab possiamo fare in modo che lo script sia eseguito una volta alla settimana, la domenica notte:</p>
<pre class="brush:bash">0 4 * * 0 /usr/local/bin/backup.sh</pre>
<p>Fine. Se avete avuto la forza di seguire questo post fino a questa riga, <strong>significa che avete realemente bisogno di usare gli script per fare i backup.</strong></p>
<p>Quindi perchè non andate oltre e li personalizzate per fare altre funzioni? Si sa, uno script tira l&#8217;altro!</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 3481px; width: 1px; height: 1px;">
<pre class="brush:bash">&amp;gt;</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.nerdsopolis.net/wp/2009/10/02/backup-perfetti-con-rsync-e-ssh/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

