<?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>Mia mamma usa Linux! &#187; Matteo Cappadonna</title>
	<atom:link href="http://www.miamammausalinux.org/author/mouser/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miamammausalinux.org</link>
	<description>Perché niente è impossibile da capire... Se lo spieghi bene !</description>
	<lastBuildDate>Mon, 02 Jan 2012 11:31:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Incron: monitorare directory e rispondere ad eventi specifici</title>
		<link>http://www.miamammausalinux.org/2011/10/monitorare-directory-e-rispondere-ad-eventi-specifici/</link>
		<comments>http://www.miamammausalinux.org/2011/10/monitorare-directory-e-rispondere-ad-eventi-specifici/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 09:13:15 +0000</pubDate>
		<dc:creator>Matteo Cappadonna</dc:creator>
				<category><![CDATA[Generale]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Utility]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1488</guid>
		<description><![CDATA[Con questo articolo vedremo come, utilizzando un tool che dialoga direttamente con il kernel Linux, monitorare un particolare path e rispondere ad alcuni eventi lanciando diversi comandi. Come al solito mi piace analizzare una problematica reale per far comprendere meglio il problema e la soluzione che andremo ad implementare. Immaginiamo di avere una macchina Linux [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2011/10/inotify.png" alt="inotify" title="inotify" width="137" height="50" class="size-full wp-image-1499" /></p>
<p>Con questo articolo vedremo come, utilizzando un tool che dialoga direttamente con il kernel Linux, monitorare un particolare path e rispondere ad alcuni eventi lanciando diversi comandi.</p>
<p>Come al solito mi piace analizzare una problematica reale per far comprendere meglio il problema e la soluzione che andremo ad implementare.</p>
<p>Immaginiamo di avere una macchina Linux (in questo caso specifico andremo ad utilizzare un server CentOS) attestata sulla rete perimetrale/pubblica della nostra azienda.</p>
<p>Questa macchina ha delle directory utente che vengono utilizzate, da procedure automatiche presenti su server remoti di altre aziende, per caricare dei file che la nostra azienda ha necessità di elaborare.</p>
<p>La soluzione &#8220;quick &amp; dirty&#8221; sarebbe quella di accordarsi con l&#8217;azienda che caricherà il file sul nostro sistema sull&#8217;ora e definire una seguente procedura:</p>
<ul>
<li>Alle ore 00:00 viene avviato il trasferimento del file (di dimensione variabile) tramite scp</li>
<li>Alle ore 01:00 viene avviato tramite cron un job che prende il file e lo elabora</li>
</ul>
<p>Questa soluzione tendenzialmente può funzionare, ma possono verificarsi diversi problemi che possono bloccare la nostra procedura. Per esempio:</p>
<ul>
<li>Un problema sulle procedure dell&#8217;azienda remota tardano o falliscono, facendo slittare l&#8217;upload del file di più di un&#8217;ora. In questo caso il nostro job in partenza alle 01:00 fallirà poiché non troverà il file caricato.</li>
<li>Sempre un problema sulle procedure dell&#8217;azienda remota fa tardare l&#8217;avvio dell&#8217;upload del file. In questo caso, quando il nostro job parte, potrebbe tentare di elaborare un file non ancora completo</li>
<li>Le procedure partono correttamente ma, un lag di rete dato da N possibili motivi, fa allungare il tempo di trasferimento del file. Anche qui il nostro job potrebbe tentare di elaborare un file non ancora completamente trasferito.</li>
<li>Delle modifiche alle procedure remote fanno variare il nome del file (che era stato precedentemente accordato). In questo caso, anche se il trasferimento è completo, il nostro script (se non correttamente ingegnerizzato) potrebbe non trovare il file semplicemente perché non si chiama come ci si aspetterebbe</li>
<li>Sempre per modifiche alle procedure remote, il file potrebbe arrivare non normalizzato (quindi con permission sballate, etc.). In questo caso, magari, il nostro script potrebbe non essere in grado di leggere/scrivere o, più in generale, di elaborare il file</li>
</ul>
<p>Come appare evidente, le problematiche possono essere molteplici!!!<br />
Fortunatamente stiamo lavorando su linux e, il più delle volte, ci viene data la possibilità di risolvere i nostri problemi con un po&#8217; di ingegno!</p>
<p><strong>inotify</strong></p>
<p>inotify è un sottosistema del kernel linux che lavora a livello di filesystem e ci permette, a fronte di alcuni eventi catturati, di notificare le variazioni all&#8217;applicazione.<br />
E&#8217; stato incluso nel mainstream del kernel linux con la versione 2.6.13 (rilasciata a Giugno 2005), ma può essere compilato con la versione 2.6.12 (e precedenti), tramite l&#8217;utilizzo di una patch.</p>
<p>In poche parole, dato un path, il sottosistema ne controlla gli inode puntati, e reagisce ad uno o più eventi su essi. A fronte dello scatenarsi di un evento (definito <strong>mask</strong> &#8211; maschera), possono essere eseguite delle operazioni.</p>
<p>Alcuni eventi che possono essere monitorati sono i seguenti:</p>
<ul>
<li><strong>IN_ACCESS</strong> &#8211; E&#8217; stato fatto un&#8217;accesso in lettura ad un file</li>
<li><strong>IN_MODIFY</strong> &#8211; E&#8217; stata eseguita una modifica ad un file</li>
<li><strong>IN_ATTRIB</strong> &#8211; E&#8217; stata eseguita una modifica agli attributi di un file</li>
<li><strong>IN_OPEN</strong> &#8211; Un file è stato aperto</li>
<li><strong>IN_CLOSE_WRITE</strong> &#8211; Un file, aperto in scrittura, è stato chiuso</li>
<li><strong>IN_CLOSE_NOWRITE</strong> &#8211; Un file, aperto NON in scrittura, è stato chiuso</li>
<li><strong>IN_MOVED_FROM</strong> e <strong>IN_MOVED_TO</strong> &#8211; Un file è stato spostato o copiato</li>
<li><strong>IN_DELETE</strong> &#8211; Un file/directory è stato cancellato</li>
<li><strong>IN_CREATE</strong> &#8211; Un file/directory è stato creato</li>
<li><strong>IN_DELETE_SELF</strong> &#8211; Il file/directory monitorato è stato cancellato</li>
</ul>
<p><strong>incrond</strong></p>
<p>incrond è un demone che funziona in maniera molto simile a quello che è l&#8217;ormai conosciutissimo demone cron; la differenza sta nel fatto che, se cron lavora con giorni ed orari, incrond lavora invece con inotify.</p>
<p>Quello che possiamo fare per rendere la nostra procedura &#8220;intelligente&#8221; è andare a monitorare il path in cui l&#8217;azienda remota esegue l&#8217;upload del file e, al termine dell&#8217;upload, lanciare il job che elabora il file.<br />
Questo ci permette di evitare di legarsi a gli orari, e di lanciare il nostro job ogni volta che un file viene caricato, indipendentemente dall&#8217;ora o dal nome del file. Esattamente quello che ci interessa.</p>
<p>Intanto andiamo ad installare il demone, operazione estremamente semplice:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># yum install incrond</pre></div></div>

<p>A questo punto, la prima cosa da fare è creare il file /etc/incrond.allow contenente la lista degli utenti abilitati all&#8217;uso di incrond. Nel nostro caso abilitiamo l&#8217;utente <em>root</em> e l&#8217;utente <em>matteo</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cat &gt; /etc/incrond.allow &lt;&lt;EOF
&gt;root
&gt;matteo
&gt;EOF
# cat /etc/incrond.allow
root
matteo</pre></div></div>

<p>Avviamo il demone ed assicuriamoci che sia abilitato per l&#8217;avvio automatico al boot della macchina:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># service incrond start
Starting incrond:                                          [  OK  ]
# chkconfig --list incrond
incrond        	0:off	1:off	2:off	3:off	4:off	5:off	6:off
# chkconfig incrond on</pre></div></div>

<p>Ok, adesso siamo pronti per il definire il nostro monitoraggio.</p>
<p>Poniamo, nel nostro esempio, che l&#8217;utente <em>matteo</em> sia l&#8217;utente che carica il file, e che lo carica nel path /home/matteo/uploads.</p>
<p>Iniziamo a definire la incrontab (vedrete che l&#8217;assonanza con cron non è solo nelle definizioni, ma anche nei comandi) per l&#8217;utente matteo. Il comando è semplicissimo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># su - matteo
$ incrontab -e</pre></div></div>

<p>Questo apre il nostro editor di default e ci permette di compilare la incrontab.<br />
Questa incrontab è composta da 3 campi (che vedremo di seguito) separati da spazio</p>
<p><strong>ATTENZIONE</strong> &#8211; I campi DEVONO essere separati dal carattere di spaziatura. Separare i campi con il consueto TAB porta a problemi di interpretazione della incrontab da parte del demone incrond (dai, è tutto molto bello, un piccolo difetto lo possiamo anche concedere <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>I tre campi sono, nell&#8217;ordine:</p>
<ul>
<li><strong>path</strong> &#8211; Il path ASSOLUTO che si desidera monitorare</li>
<li><strong>mask</strong> &#8211; L&#8217;evento che si vuole monitorare. Sono supportati tutte le maschere che sono state descritte prima, più la maschera IN_ALL_EVENTS che, semplicemente, cattura tutti gli eventi (ottima per il debugging)</li>
<li><strong>command</strong>- Il comando da eseguire quando viene catturato l&#8217;evento. Da notare che in questo comando possiamo utilizzare delle variabili di inotify che ci vengono passate direttamente dal demone. Queste variabili sono:
<ul>
<li><strong>$@</strong> &#8211; Il path monitorato</li>
<li><strong>$#</strong> &#8211; Il file sul quale si è scatenato l&#8217;evento</li>
<li><strong>$%</strong> &#8211; L&#8217;evento, in forma testuale, che si è verificato</li>
<li><strong>$&amp;</strong> &#8211; L&#8217;evento, in forma numerica, che si è verificato</li>
<li><strong>$$</strong> &#8211; Il carattere $</li>
</ul>
</li>
</ul>
<p>Semplice, non trovate?</p>
<p>Allora, torniamo all&#8217;esempio. Il nostro job si trova nella directory /home/matteo/scripts/, si chiama <em>elaborazione.sh</em> ed accetta come parametro il nome del file da elaborare.</p>
<p>Facciamo un&#8217;attimo il punto della situazione. In un certo momento (non sappiamo quale), la procedura remota andrà a caricare, con scp, il nostro file.<br />
Una volta effettuata la connessione con successo, il file verrà in primo luogo creato (IN_CREATE), aperto in scrittura (IN_OPEN), scritto (una sequenza di IN_MODIFY) ed infine chiuso (IN_CLOSE_WRITE, visto che era stato aperto in scrittura).</p>
<p>Quindi, l&#8217;evento che andrà a determinare la fine del trasferimento è IN_CLOSE_WRITE. Andiamo quindi a compilare la incrontab dell&#8217;utente matteo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/home/matteo/uploads IN_CLOSE_WRITE /home/matteo/scripts/elaborazione.sh $@/$#</pre></div></div>

<p>Salviamo usciamo ed assicuriamoci che la nuova incrontab sia stata letta ed interpretata dal sistema:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">table updated
$ exit
# tail -1 /var/log/cron
Oct 27 10:30:39 myserver incrond[889]: table for user matteo changed, reloading</pre></div></div>

<p>Possiamo testare se funziona caricando un dummy file (supponiamo che i file contenti il testo &#8220;dummy&#8221; vengano ignorati dal nostro script) da una macchina remota:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">client$ cat &gt; dummyfile &lt;&lt;EOF
&gt;dummy
&gt;EOF
client$ cat dummyfile
dummy
client$ scp dummyfile matteo@myserver:uploads/
Password:</pre></div></div>

<p>Torniamo sul server e, dal log di cron, vediamo che incrond ha catturato l&#8217;evento ed ha eseguito il nostro elaboratore:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># tail -1 /var/log/cron
Oct 27 10:35:43 myserver incrond[889]: (matteo) CMD (/home/matteo/scripts/elaborazione.sh /home/matteo/uploads/dummyfile)</pre></div></div>

<p>&nbsp;</p>
<p><strong>Conclusioni</strong></p>
<p>Abbiamo visto come installare e configurare incrond per monitorare il cambio di stato di un file in una directory.<br />
Questa è una possibile soluzione pratica ad un problema che, tendenzialmente, si verifica abbastanza di frequente in ambienti enterprise, in cui ci sono flussi di lavoro locali/remoti che devono lavorare in relazione gli uni con gli altri.</p>
<p>In realtà, gli utilizzi di inotify sono estremamente ampi; per esempio, è il sistema che viene normalmente utilizzato dagli indicizzatori di filesystem su linux (per esempio, Beagle di SUSE).<br />
Andando a monitorare l&#8217;intero filesystem (/) ed avendo le notifiche sulle modifiche di qualsiasi file al suo interno, l&#8217;indicizzatore può aggiornare i suoi database senza doversi rileggere l&#8217;intero filesystem.</p>
<p>Un&#8217;altro utilizzo può essere quello di monitorare il file di log di un&#8217;applicazione. Quando questa applicazione andrà a loggare qualcosa, possiamo mandare una mail contenente il file di configurazione a qualcuno.</p>
<p>Il limite è il vostro ingegno <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/10/monitorare-directory-e-rispondere-ad-eventi-specifici/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Configurare Nagios per ricevere Trap SNMP</title>
		<link>http://www.miamammausalinux.org/2011/09/configurare-nagios-per-ricevere-trap-snmp/</link>
		<comments>http://www.miamammausalinux.org/2011/09/configurare-nagios-per-ricevere-trap-snmp/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 12:58:38 +0000</pubDate>
		<dc:creator>Matteo Cappadonna</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1454</guid>
		<description><![CDATA[Per sua stessa natura, Nagios funziona generalmente in maniera &#8220;attiva&#8221;, andando ad eseguire lui stesso i check verso gli host remoti, tramite script già forniti o custom, oppure interrogando direttamente un demone NRPE presente sulla macchina remota, e che in genere esegue check locali. Nagios, però, può essere configurato per eseguire dei check &#8220;passivi&#8221;, ovvero [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/nagios.png" alt="nagios" width="100" class="alignnone size-full wp-image-174" /></p>
<p>Per sua stessa natura, Nagios funziona generalmente in maniera &#8220;attiva&#8221;, andando ad eseguire lui stesso i check verso gli host remoti, tramite script già forniti o custom, oppure interrogando direttamente un demone NRPE presente sulla macchina remota, e che in genere esegue check locali.</p>
<p>Nagios, però, può essere configurato per eseguire dei check &#8220;passivi&#8221;, ovvero fare in modo che un check che giri, possa essere messo in stati particolari da programmi estetrni. Questo è quello che normalmente succede quando si lavora sull&#8217;interfaccia web e si imposta, per esempio, un Acknowledge su un servizio, o si disabilitano le notifiche.</p>
<p>La cosa interessante che andremo a fare in questo tutorial è un&#8217;ulteriore step. In pratica faremo in modo che non solo il server su cui gira Nagios possa ricevere delle trap SNMP, ma che Nagios stesso reagisca, in maniera predeterminata, a queste trap.</p>
<p>Facciamo un&#8217;esempio pratico (sarà poi quello utilizzato nel tutorial, e che è stato personalmente testato da me): un bilanciatore hardware F5 è stato configurato per lanciare delle trap verso una macchina Nagios. Questo bilanciatore invia non solo trap relative al suo stato, ma anche delle trap che indicano lo stato di un host reale bilanciato.<br />
In pratica, quello che si otterrà è il seguente flusso di eventi:</p>
<ol>
<li>L&#8217;host reale ha qualche problema, e va in down (fisicamente, o anche il solo servizio bilanciato dall&#8217;F5)</li>
<li>Il bilanciatore se ne accorge, disabilita il reale dal pool legato al VIP (Virtual IP)</li>
<li>Il bilanciatore manda una trap verso il server su cui gira Nagios, identificando che un particolare host va in down</li>
<li>Il server cattura la trap, la interpreta, ed inietta direttamente in Nagios un comando</li>
<li>Nagios mette un particolare servizio in stato CRITICO, scatenando anche le notifiche del caso</li>
</ol>
<p>In questo caso vediamo che non ci sono latenze dovute al timeslice di check di Nagios, ma la notifica è immediata alla verifica del problema.</p>
<p>Prima di entrare nel vivo del tutorial, tengo a precisare non verrà trattata l&#8217;installazione e/o la configurazione di Nagios (se non per quanto riguarda le parti relative al tutorial stesso), e l&#8217;ambiente su cui è stato testato il tutto gira attualmente con questo OS/questi software:</p>
<ul>
<li>Debian GNU/Linux 6.0</li>
<li>Nagios3 presente sui repository Debian (Nagios 3.2.1-2)</li>
</ul>
<p>Quindi farò riferimento ai path di default di questo sistema.<br />
Bando alle ciance, andiamo ad incominciare <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p><strong>Configurare il sistema per ricevere le trap SNMP</strong></p>
<p>Il primo passo è quello di far si che il nostro server (sul quale già sta girando Nagios) possa ricevere delle trap SNMP.<br />
Niente di più semplice, dovreste avere già installato il pacchetto snmpd, nel caso in cui non lo fosse, un semplice</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># apt-get install snmpd</pre></div></div>

<p>vi risolverà il problema.<br />
Questo pacchetto contiene un demone in grado di ricevere delle trap snmp. Per configurarlo editate il file /etc/default/snmpd aggiungendo/modificando le seguenti variabili:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">TRAPDRUN=yes
TRAPDOPTS='-On -u snmptt -p /var/run/snmptrapd.pid'</pre></div></div>

<p>Facendola breve diciamo di far partire il demone per le trap (TRAPDRUN=yes) e lo facciamo lanciare con le seguenti opzioni:</p>
<ul>
<li><strong>-On</strong>     Fa si che il demone usi gli OID in formato numerico, ed evita che il traduttore debba eseguire la traduzione dal formato testuale a quello numerico</li>
<li><strong>-u snmptt</strong>     Fa girare il demone con l&#8217;utente snmptt</li>
<li><strong>-p /var/run/snmptrapd.pid</strong>     Definisce il PIDfile in cui andare a scrivere il pid del processo</li>
</ul>
<p>Andiamo quindi a definire cosa il demone snmptrapd deve fare alla ricezione di una trap. Modifichiamo quindi il file<br />
/etc/snmp/snmptrapd.conf inserendo le seguenti direttive alla fine:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">disableAuthorization yes
traphandle default /usr/sbin/smptt</pre></div></div>

<p>In questo caso, diciamo al demone di disattivare l&#8217;autenticazione per l&#8217;invio delle trap (per questo tutorial useremo il metodo KISS: Keep It Simple and Stupid), e diciamo al demone di prendere tutte le trap e girarle al software /usr/sbin/smptt (di cui parleremo a breve).<br />
Aspettiamo a riavviare il demone poiché dobbiamo prima assicurarci di aver installato SNMPTT.</p>
<p>&nbsp;</p>
<p><strong>Configurare il traduttore di trap SNMPTT</strong></p>
<p>Il traduttore è una parte fondamentale. E&#8217; quel software che si occupa, una volta ricevuta la trap, di interpretarla, tradurla e scriverla da qualche parte.<br />
La traduzione viene fatta utilizzando dei file .MIB che altro non sono che dizionari contenenti un riferimento TRAP -&gt; MESSAGGIO.<br />
Praticamente tutti i produttori di hardware che emettono trap SNMP forniscono i file .MIB necessari alla traduzione, e la F5 non è da meno.</p>
<p>Intanto installiamo il traduttore:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># apt-get install snmptt</pre></div></div>

<p>Una volta installato, andiamo a modificare il file di configurazione /etc/snmp/snmptt.ini con i seguenti parametri:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mode = standalone          # Questo perché viene invocato da snmptrapd e non deve girare come demone
dns_enable = 0             # Evitiamo che risolva l'hostname per ogni trap che gli arriva
strip_domain = 0           # Diciamogli di non rimuovere il dominio dall'eventuale hostname
net_snmp_perl_enable = 1   # Può utilizzare il perl la traduzione
translate_value_oids = 1   # Traduce gli OID in formato testuale leggibile breve
translate_enterprise_oid_format = 1   # come sopra
translate_trap_oid_format = 1         # come sopra
translate_varname_oid_format = 1      # come sopra
log_enable = 1             # Abilita il logging delle trap
syslog_enable = 1          # Abilita il logging delle trap sul syslog
syslog_level = info        # Definisce il livello di logging per le trap su syslog</pre></div></div>

<p>A questo punto portiamo sulla macchina i vari files .MIB relativi all&#8217;hardware che andrà a scatenare le trap e traduciamo questi file in formato comprensibile con snmptt. Nulla di più semplice:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mkdir /etc/snmp/mibs    # In questa directory metteremo tutti i mib tradotti
# snmpttconvertmib --in=F5-BIGIP-COMMON.mib --out=F5-BIGIP-COMMON.conf
# mv F5-BIGIP-COMMON.conf /etc/snmp/mibs/</pre></div></div>

<p>&nbsp;</p>
<p>Lanciamo il comando per tutti i MIB che ci fornisce il produttore.<br />
A questo punto, riapriamo il file di configurazione di snmptt (/etc/snmp/snmptt.ini) e terminiamo la configurazione aggiungendo/modificando alla fine:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">snmptt_conf_files = &amp;lt;&amp;lt;END
/etc/snmp/snmptt.conf
/etc/snmp/mibs/F5-BIGIP-COMMON.conf
END</pre></div></div>

<p>Riga per riga, andiamo a mettere tutti i file .conf che abbiamo generato con smpttconvertmib. A questo punto possiamo restartare il demone SNMPD (così da far partire il gestore di trap) e verificare che sia effettivamente partito:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /etc/init.d/snmpd restart
# cat /var/run/snmptrapd.pid
7464</pre></div></div>

<p>Perfetto, mettiamoci in tali sul file del syslog (per default il /var/log/messages) e dovremmo iniziare a veder passare le trap:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># tail -f /var/log/messages
Sep 20 11:23:40 nagios-mi snmptt[111]: .1.3.6.1.4.1.3375.2.4.0.29 Normal &quot;Status Events&quot; 192.168.0.1 - The system is in an unusable situation. AUDIT - user admin - RAW: httpd(mod_auth_pam): user=admin(admin) partition=[All] level=Administrator tty=1 host=10.10.0.1 attempts=1 start=\&quot;Tue Sep 20 11:03:00 2011\&quot; end=\&quot;Tue Sep 20 11:23:30 2011\&quot;.</pre></div></div>

<p>Ottimo, riceviamo le trap, ora dobbiamo trovare il modo di dire a Nagios che questa trap ha un significato, dirgli quale, e di scatenare un evento… procediamo <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p><strong>Catturare le trap</strong></p>
<p>Ci viene in aiuto un&#8217;ottimo tool di nome SEC. Questo tool, in maniera generale, permette di analizzare live il contenuto di un file (quindi resta in ascolto ed analizza i nuovi contenuti) e di eseguire determinate operazioni a verificarsi di particolari eventi.<br />
Nel nostro caso, lo metteremo in ascolto sul file in cui vengono slogate le trap /var/log/messages e, con il match su di una particolare RegExp, viene lanciato uno script con determinati parametri.<br />
SEC è uno script in perl, ma ne esiste comunque una versione pacchettizzata per debian, dunque:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># apt-get install sec</pre></div></div>

<p>Una volta installato, andiamo a modificare il file di configurazione /etc/sec.conf, inserendo i seguenti parametri:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">type=Single
ptype=RegExp
pattern=.*(Normal|INFORMATIONAL|MINOR|WARNING|SEVERE|MAJOR|CRITICAL)\ \&quot;Status Events\&quot;\ (\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)\ \-\ (A service is detected (UP|DOWN)\.\ Pool\ member\ (\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)(.*)|(.*))
desc=snmptrap received from $2
action=shellcmd /usr/lib/nagios/eventhandlers/snmptraphandling.sh $2 $1 &quot;$3&quot; $4 $5</pre></div></div>

<p>In pratica viene detto a SEC di eseguire la &#8220;action&#8221; quando un testo fa match con la regular expression definita in pattern. Senza stare li a parlare di regular expression (potremmo andare avanti per giorni e giorni), se arriva una trap SNMP con il seguente testo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Sep 20 11:23:40 nagios-mi snmptt[111]: .1.3.6.1.4.1.3375.2.4.0.29 Normal &quot;Status Events&quot; 192.168.0.1 - The system is in an unusable situation. AUDIT - user admin - RAW: httpd(mod_auth_pam): user=admin(admin) partition=[All] level=Administrator tty=1 host=10.10.0.1 attempts=1 start=\&quot;Tue Sep 20 11:03:00 2011\&quot; end=\&quot;Tue Sep 20 11:23:30 2011\&quot;.</pre></div></div>

<p>otteniamo in output le seguenti variabili:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$1 = Normal
$2 = 192.168.0.1
$3 = The system is in an unusable situation. AUDIT - user admin - RAW: httpd(mod_auth_pam): user=admin(admin) partition=[All] level=Administrator tty=1 host=10.10.0.1 attempts=1 start=\&quot;Tue Sep 20 11:03:00 2011\&quot; end=\&quot;Tue Sep 20 11:23:30
$4 =
$5 =</pre></div></div>

<p>Come vediamo le ultime due variabili sono vuote. Nel caso, invece, ci arrivi una trap formata in quest&#8217;altra maniera (che indica lo stato UP/DOWN di un server fisico controllato dal bilanciatore):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Sep 20 11:47:33 nagios-mi snmptt[111]: .1.3.6.1.4.1.3375.2.4.0.10 Normal &quot;Status Events&quot; 192.168.0.1 - A service is detected DOWN. Pool member 192.168.0.100:18009 monitor status down. 192.168.0.100 18009</pre></div></div>

<p>otteniamo, invece, in output le seguenti variabili:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$1 = Normal
$2 = 192.168.0.1
$3 = A service is detected DOWN. Pool member
$4 = DOWN
$5 = 192.168.0.100</pre></div></div>

<p>In quest&#8217;altro caso le ultime due variabili sono valorizzate ed identificano, rispettivamente, lo stato del reale (UP o DOWN) ed il reale in question (192.168.0.100).</p>
<p>Ovviamente, questa RegExp è stata costruita in funzione di come SNMPTT, con i MIB forniti da F5, traduce le trap. Hardware differente, con MIB differenti, tradurranno le trap in maniera differente, e sarà quindi necessario andare a trovare una RegExp funzionante per quella casistica.</p>
<p>Ne approfitto per segnalare il link <a href="http://gskinner.com/RegExr/" target="_blank">http://gskinner.com/RegExr/</a> veramente molto comodo per scrivere e testare le RegExp.</p>
<p>Quindi, abbiamo intercettato le trap con SEC, ed eseguiamo questo script /usr/lib/nagios/eventhandlers/snmptraphandling.sh passandogli le 5 variabili ottenute dalla RegExp, siano esse valorizzate o meno. Ma cosa fa questo script?</p>
<p>&nbsp;</p>
<p><strong>snmptraphandling.sh</strong></p>
<p>Ho scritto personalmente questo script, basandomi su un&#8217;idea di Francois Meehan, autore di uno script python simile ma meno specializzato.</p>
<p>Potete scaricarlo da qui: <a href="http://www.miamammausalinux.org/wp-content/uploads/2011/09/snmptraphandling.zip">snmptraphandling.zip</a></p>
<p>Questa versione in bash accetta in ingresso le seguenti variabili (nel seguente ordine):</p>
<p>HOST: Obbligatoria, identifica l&#8217;host che ha inviato la trap<br />
SEVERITY: Obbligatoria, identifica il &#8220;peso&#8221; della trap (Normal, critical, etc.) così come viene definita da F5<br />
&#8220;DATA&#8221;: Obbligatoria dentro i doppi apici. Contiene un testo che identifica meglio la trap, una descrizione<br />
UP|DOWN: Opzionale, identifica lo stato di un reale<br />
ALARMEDHOST: Opzionale, identifica l&#8217;host al quale viene applicata la variabile precedente.</p>
<p>Intanto lo script definisce, a seconda della SEVERITY, che valori applicare al Nagios.<br />
Inoltre, nel caso vengano specificate anche le ultime due variabili, esegue operazioni differenti per scatenare allarmi specifici.</p>
<p>Ma come dialoga con Nagios? Semplicissimo, costruisce un comando ad-hoc interpretabile da Nagios, e lo inetta nel file</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/var/lib/nagios3/rw/nagios.cmd</pre></div></div>

<p>Questo file è specializzato per inviare segnali a Nagios e fargli eseguire operazioni particolari.</p>
<p>In pratica, all&#8217;arrivo di una trap viene scatenato un evento indirizzato all&#8217;host $HOST, per un servizio chiamato:</p>
<p>snmp_trap_handling_$HOST-…. Nel caso in cui non siano specificate le ultime 2 variabili<br />
snmp_trap_handling_$ALARMED_HOST Nel caso in cui siano specificate le ultime 2 variabili.</p>
<p>Ma prendiamo in mano un&#8217;esempio completo, così da essere più chiari.<br />
Ci arriva dal bilanciatore, per esempio, una trap SNMP che ci identifica che un&#8217;host è andato giù; all&#8217;interno del file<br />
/var/log/messages verrà scritto (da SNMPTT) il seguente messaggio:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Sep 20 11:47:33 nagios-mi snmptt[111]: .1.3.6.1.4.1.3375.2.4.0.10 Normal &quot;Status Events&quot; 192.168.0.1 - A service is detected DOWN. Pool member 192.168.0.100:18009 monitor status down. 192.168.0.100 18009</pre></div></div>

<p>SEC vedrà che questo testo fa match con la RegExp che gli abbiamo applicato, e lancerà questo comando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/usr/lib/nagios/eventhandlers/snmptraphandling.sh 192.168.0.1 Normal \
&quot;A service is detected DOWN. Pool member&quot; DOWN 192.168.0.100</pre></div></div>

<p>Lo script prenderà questi valori, li andrà ad elaborare (per esempio, cercando nelle configurazioni di nagios, andrà a tradurre 192.168.0.1 con bil-f5, che altro non è che il nome dell&#8217;host specificato in nagios) ed inietterà il seguente testo nel file<br />
/var/lib/nagios3/rw/nagios.cmd:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[1316513822] PROCESS_SERVICE_CHECK_RESULT;bil-f5;snmp_trap_handling_192.168.0.100;2;A service is detected DOWN. Pool member 192.168.0.100:18009 monitor status down. 192.168.0.100</pre></div></div>

<p>Questo testo fa si che il servizio &#8220;snmp_trap_handling_192.168.0.100&#8243; venga applicato lo stato 2, ovvero il CRITICAL per Nagios.</p>
<p><strong>Configurare Nagios</strong></p>
<p>Per configurare il Nagios, andremo a creare 3 strutture nuove: la prima è un servizio template che funziona in passivo e che viene usato per creare qualsiasi servizio relativo alle trap snmp; la seconda è l&#8217;host che identifica il bilanciatore; la terza è il servizio vero e proprio che verrà messo in critical o meno all&#8217;arrivo della trap.<br />
Quindi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">define service {
name generic-snmptrap
active_checks_enabled 1
passive_checks_enabled 1 ; Passive service checks are enabled
is_volatile 1
initial_state o
check_period never
notification_interval 120
notification_options w,u,c,r
notification_period 24x7
check_command return-ok
max_check_attempts 1
check_freshness 0
stalking_options o,w,u,c
register 0 ; Not register. Its just a template
}</pre></div></div>

<p>Notiamo alcune configurazioni particolari:</p>
<p>passive_checks_enabled 1 Determina che il servizio risponde a check passivi</p>
<p>active_checks_enabled 1 Attiva anche i check attivi. Questo è stato fatto solo perché personalmente trovo che<br />
Nagios debba sempre mostrare uno stato completamente verde. Disattivando i<br />
check attivi, nel TacticalOverview di Nagios avremmo un host segnalato in rosso.</p>
<p>check_period never Non vengono mai schedati check per questo servizio (questo perché il servizio<br />
risponde a delle trap e non esegue direttamente i check)</p>
<p>check_command return-ok Attivando i check attivi, è necessario definite un check_command. Ho usato<br />
return-ok che è un check standard di Nagios che ritorna sempre un stato OK</p>
<p>stalking_options o,w,u,c Questo serve per evitare che mille trap dello stesso tipo vadano a saturare il<br />
Nagios</p>
<p>A questo punto definiamo l&#8217;host:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">define host{
use generic-host
host_name bil-f5
alias bil-f5
address 192.168.0.1
}</pre></div></div>

<p>ed infine il servizio:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">define service{
use generic-snmptrap
host_name bil-f5
service_description snmp_trap_handling_192.168.0.100
}</pre></div></div>

<p>Vediamo quindi che, il match che esegue il Nagios, è sulla descrizione del servizio.</p>
<p>&nbsp;</p>
<p><strong>Conclusioni</strong></p>
<p>Abbiamo infine visto il giro del fumo. Sembrano tante parole ed il tutto molto complicato, ma vi assicuro che, una volta implementato, va tutto liscio come l&#8217;olio.</p>
<p>Buon lavoro <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/09/configurare-nagios-per-ricevere-trap-snmp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creare un&#8217;immagine di un disco USB&#8230; senza disco USB.</title>
		<link>http://www.miamammausalinux.org/2009/09/creare-unimmagine-di-un-disco-usb-senza-disco-usb/</link>
		<comments>http://www.miamammausalinux.org/2009/09/creare-unimmagine-di-un-disco-usb-senza-disco-usb/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 09:27:18 +0000</pubDate>
		<dc:creator>Matteo Cappadonna</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Immagine disco]]></category>
		<category><![CDATA[Mount]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Usb]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=804</guid>
		<description><![CDATA[Eccoci ancora qui con un altro tutorial semplice semplice ma, in alcuni casi, molto utile. Il problema di oggi è stato il seguente: devo montare su una lama HP l&#8217;immagine di un disco USB per poter caricare dei file su un sistema &#8220;live&#8221; (quindi con lettore cd occupato) senza dover configurare la rete (e quindi, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Eccoci ancora qui con un altro tutorial semplice semplice ma, in alcuni casi, molto utile.</p>
<p>Il problema di oggi è stato il seguente: devo montare su una lama HP l&#8217;immagine di un disco USB per poter caricare dei file su un sistema &#8220;live&#8221; (quindi con lettore cd occupato) senza dover configurare la rete (e quindi, far riconfigurare la porta degli switch).</p>
<p>Le soluzioni sono 2:<br />
1) Prendere una chiavetta USB, caricare i file, fare un&#8217;immagine e collegarla<br />
2) Creare direttamente da sistema l&#8217;immagine di una chiavetta USB, caricare i file, e collegarla.</p>
<p>Dato che la prima soluzione prevede comunque di avere una chiavetta di dimensione &#8220;trasportabile&#8221; via rete (personalmente ho un pendrive da 16GB: per due file da 2mb l&#8217;uno, farmi un&#8217;immagine da 16GB e spostarla via rete è assurdo), la seconda è molto più malleabile in termine di dimensioni dell&#8217;immagine che si andrà a creare.</p>
<p>Ma, andiamo a cominciare: per prima cosa ci interessa creare un file (che altro non sarà che l&#8217;immagine della nostra chiavetta) di una dimensione particolare; nel mio caso, 10mb sono più che sufficienti.<br />
Mano al buon, vecchio <strong>dd</strong> e dunque:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dd if=/dev/zero of=usbDisk.img bs=1024 count=10000</pre></div></div>

<p>Quindi, partendo dal device &#8220;zero&#8221; (contenente, ovviamente, solo 0) creo un file &#8220;usbDisk.img&#8221; di dimensione 1024byte x 10000 = 1kb x 10000 = 10mb</p>
<p>Terminata la creazione, scatta la magia: andiamo a collegare questo file ad un device facendolo, in effetti, vedere al sistema come un dispositivo fisicamente collegato alla macchina:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ losetup -f usbDisk.img</pre></div></div>

<p>Questo comando prende il file usbDisk.img e lo collega al device /dev/loop0</p>
<p>Ora, come ogni disco che si rispetti, andiamo a crearci sopra una partizione; armiamoci di cfdisk (molto semplice, i puristi preferiranno fdisk, ma fate voi) e creiamo una singola partizione di tipo &#8220;Linux&#8221; sul disco:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cfdisk /dev/loop0</pre></div></div>

<p>Salviamo ed usciamo.<br />
In realtà quello che ci serve non è la partizione, bensì il fatto che cfdisk, in fase di scrittura, determina e scrive direttamente sul device informazioni come i cilindri, ecc. che servono successivamente per creare il filesystem.</p>
<p>Quindi, visto che vogliamo simulare un disco usb &#8220;standard&#8221;, andiamo a metterci sopra un filesystem che sia comune, e cosa meglio del vecchio fat32 per questo?</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdosfs -F 32 /dev/loop0</pre></div></div>

<p>Terminata la creazione possiamo montare il disco usb come un normalissimo device:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkdir -p /mnt/fintoDisco
$ mount /dev/loop0 /mnt/fintoDisco</pre></div></div>

<p>e copiarci sopra i file interessati.</p>
<p>Quando abbiamo finito ricordiamoci di smontare il device:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ umount /mnt/fintoDisco</pre></div></div>

<p>e, soprattutto, di sganciare il device dal file reale:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ losetup -d /dev/loop0</pre></div></div>

<p>Ora possiamo portarci in giro il file come più ci aggrada.</p>
<p>Buon divertimento e buon lavoro</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/09/creare-unimmagine-di-un-disco-usb-senza-disco-usb/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Loggare una sessione di shell con &#8220;script&#8221;</title>
		<link>http://www.miamammausalinux.org/2009/01/loggare-una-sessione-di-shell-con-script/</link>
		<comments>http://www.miamammausalinux.org/2009/01/loggare-una-sessione-di-shell-con-script/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 11:27:35 +0000</pubDate>
		<dc:creator>Matteo Cappadonna</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[Loggare sessioni]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=325</guid>
		<description><![CDATA[Quante volte è capitato di eseguire un&#8217;operazione, magari per la prima volta, e dimenticarsi completamente di prendere appunti? Lavorando in ambiente sistemistico, se questo avvenimento non è quotidiano, poco ci manca! Ed in genere come risolviamo il problema? Le soluzioni sono due: Scrolling del buffer del terminale: Alt+Pag.Up permettono di rileggere cosa si è fatto; [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Quante volte è capitato di eseguire un&#8217;operazione, magari per la prima volta, e dimenticarsi completamente di prendere appunti?</p>
<p>Lavorando in ambiente sistemistico, se questo avvenimento non è quotidiano, poco ci manca!</p>
<p>Ed in genere come risolviamo il problema? Le soluzioni sono due:</p>
<ol>
<li><strong>Scrolling del buffer del terminale</strong>: Alt+Pag.Up permettono di rileggere cosa si è fatto; il problema è che il buffer dei terminali è limitato (specialmente se si lavora in ambiente non grafico), e spesso alcune cose si perdono comunque;</li>
<li><strong>Visione della history</strong>: I moderni terminali supportano la history, permettendo così di scorrere nei comandi lanciati e richiamarli velocemente; il problema è che anche visualizzando la history, non abbiamo l&#8217;output dei comandi che abbiamo lanciato.</li>
</ol>
<p>Quello che servirebbe è un software che permetta di eseguire un logging completo (quindi sia dell&#8217;input che immettiamo che dell&#8217;output che viene generato).</p>
<p>Ci viene in aiuto <strong>script</strong>! Tanto semplice quanto funzionale.</p>
<p>Il modo più &#8220;pulito&#8221; per eseguire il comando è il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ script
Script iniziato, il file è typescript
$</pre></div></div>

<p>Come vedete pare che non sia successo nulla. Ed in effetti possiamo dimenticarci di aver lanciato il comando. Continuiamo pure con il nostro lavoro&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ su -
Password:
# pwd
/root
# cd /etc/ssh/
# cat sshd_config | grep PermitRoot
PermitRootLogin yes
# sed -i -e &quot;s/PermitRootLogin yes/PermitRootLogin no/&quot; sshd_config
# cat sshd_config | grep PermitRoot
PermitRootLogin no
# /etc/init.d/ssh restart
* Restarting OpenBSD Secure Shell server sshd                           [ OK ]
# exit
logout
$</pre></div></div>

<p>Semplicemente quando avremo finito la nostra sessione di lavoro, e lanceremo il consueto &#8220;<em>exit</em>&#8220;, avremo un output di questo tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ exit
exit
Script effettuato, il file è typescript</pre></div></div>

<p>Ora, se dovessimo andare a rivedere la nostra sessione, magari per trasformarla in un howto od in un file da tenere sott&#8217;occhio quando tra 6 mesi ci verrà richiesto di fare la stessa cosa, possiamo vedere il contenuto del file &#8220;typescript&#8221; generato da script:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mcappadonna@laptop ~ $ cat typescript
Script iniziato su ven 16 gen 2009 12:08:38 CET
$ su -
Password:
# pwd
/root
# cd /etc/ssh/
# cat sshd_config | grep PermitRoot
PermitRootLogin yes
# sed -i -e &quot;s/PermitRootLogin yes/PermitRootLogin no/&quot; sshd_config
# cat sshd_config | grep PermitRoot
PermitRootLogin no
# /etc/init.d/ssh restart
* Restarting OpenBSD Secure Shell server sshd                          [ OK ]
# exit
logout
$ exit
exit
&nbsp;
Script effettuato su ven 16 gen 2009 12:09:38 CET</pre></div></div>

<p>Alcune opzioni comode di script sono le seguenti:</p>
<ul>
<li><strong>-a</strong> : Appende l&#8217;output ad un file già presente;</li>
<li><strong>-q</strong> : Elimina dall&#8217;output i messaggi di script;</li>
<li><strong>-t</strong> : Aggiunge all&#8217;output l&#8217;indicazione dell&#8217;ora (utile per tenere un timestamp del lavoro)</li>
</ul>
<p>Ovviamente, potete aggiungere a script l&#8217;indicazione del nome del file da salvare:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ script sessioneDiProva.txt
Script iniziato, il file è sessioneDiProva.txt
$</pre></div></div>

<p>Un&#8217;ultima cosa: se si dovesse avere la necessità di seguire in due utenti (remoti) la stessa sessione di shell ma non fosse possibile installare &#8220;<em>screen</em>&#8221; sulla macchina, una soluzione elegante può essere la seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mkfifo temp; script -f temp</pre></div></div>

<p>Il comando sembrerà appeso, ma nel momento in cui l&#8217;altro utente va ad eseguire un cat sul file, la sessione di script ha inizio e tutti vedono &#8220;live&#8221; la sessione di shell:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat temp
Script iniziato su ven 16 gen 2009 12:16:28 CET
$</pre></div></div>

<p>Comodo no?</p>
<p>Buon lavoro.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/01/loggare-una-sessione-di-shell-con-script/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

