<?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>nordri&#039;s Blog &#187; bash</title>
	<atom:link href="http://www.muspells.net/blog/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.muspells.net/blog</link>
	<description>Estamos trabajando en ello...</description>
	<lastBuildDate>Wed, 04 Jan 2012 16:01:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Utilizando ficheros de configuración en los scripts de Bash</title>
		<link>http://www.muspells.net/blog/2011/01/utilizando-ficheros-de-configuracion-en-los-scripts-de-bash/</link>
		<comments>http://www.muspells.net/blog/2011/01/utilizando-ficheros-de-configuracion-en-los-scripts-de-bash/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 09:32:13 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux Script]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[source]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=634</guid>
		<description><![CDATA[En algunas ocasiones tal vez necesites crear un script de Bash para resolver algunas tareas y que utilice un fichero de configuración. ¿Cómo lo plantearías? ¿Cómo implementarías el fichero de configuración? Lo primero que pensé fue en utilizar el comando cut de forma que el fichero de configuración tuviera un formato de etiqueta=valor, y podría [...]]]></description>
			<content:encoded><![CDATA[<p>En algunas ocasiones tal vez necesites crear un script de Bash para resolver algunas tareas y que utilice un fichero de configuración. ¿Cómo lo plantearías? ¿Cómo implementarías el fichero de configuración? </p>
<p>Lo primero que pensé fue en utilizar el comando <strong>cut</strong> de forma que el fichero de configuración tuviera un formato de <em>etiqueta=valor</em>, y podría &#8220;cortar&#8221; para leer la etiqueta y el valor. Pero es mala cosa, porque por cada línea del fichero de configuración tienes que cortar y luego saber qué etiqueta es. La mejor solución, el comando <strong>source</strong></p>
<p>Suponemos un fichero de configuración <em>config.ini</em> como este:</p>
<pre>
PATTERN="$hello*"
FILENAME=hello.txt
OUTPUT=result.txt
</pre>
<p>Y queremos que nuestro script lea estas variables y ejecute <strong>grep</strong></p>
<pre>
#!/bin/bash
source config.ini

grep ${PATTERN} ${FILENAME} > ${OUTPUT}
</pre>
<p>El comando <strong>source</strong> importara todas las variables del fichero de configuración <em>config.ini</em> en nuestro script y prodremos utilizarlas para lanzar <strong>grep</strong>. También podemos sustituir el comando <strong>source</strong> por un <strong>.</strong> (un punto) así:</p>
<pre>
. config.ini
</pre>
<p>También podemos importar otros script con sentencias de control (<strong>if-else</strong>) pero hay que tener cuidado porque si el script que importamos contiene el comando <strong>exit</strong> el programa finalizará en ese punto. Por ejemplo, importamos el siguente trozo de código:</p>
<p>config.sh</p>
<pre>
#!/bin/bash
HELLO=world
exit
</pre>
<p>Y lo utilizamos en este:</p>
<p>parent.sh</p>
<pre>
#!/bin/bash
source config.sh
echo ${HELLO}
</pre>
<p>Cuando lanzamos el script <strong>./parent.sh</strong> terminará antes de llegar a la línea de <strong>echo</strong> porque ha leído el <strong>exit</strong></p>
<p>Espero que este pequeño truco os de una idea de como utilizar el comando <strong>source</strong> para importar fichero de configuración dentro de vuestros scripts</p>
<p>Es una traducción de este truco en <a href="http://linux.byexamples.com/archives/553/config-file-for-your-bash-script/">linux.byexamples.com</a></p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2011%2F01%2Futilizando-ficheros-de-configuracion-en-los-scripts-de-bash%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Utilizando ficheros de configuración en los scripts de Bash. via @nordri" data-url="http://www.muspells.net/blog/2011/01/utilizando-ficheros-de-configuracion-en-los-scripts-de-bash/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/01/utilizando-ficheros-de-configuracion-en-los-scripts-de-bash/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Notificaciones en Bash y Python</title>
		<link>http://www.muspells.net/blog/2010/06/notificaciones-en-bash-y-python/</link>
		<comments>http://www.muspells.net/blog/2010/06/notificaciones-en-bash-y-python/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 11:02:37 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux Script]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[notificacion]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=471</guid>
		<description><![CDATA[Aunque mis conocimientos se basan en estar muchas horas en la consola, escribiendo crípticos comandos, que sólo yo y Jon Maddog conocemos, utilizo un gestor de ventanas para navegar por la web, ver vídeos, escuchar música y cosas así. Puedo unir la potencia de la línea de comandos con el atractivo visual de un entorno [...]]]></description>
			<content:encoded><![CDATA[<p>Aunque mis conocimientos se basan en estar muchas horas en la consola, escribiendo crípticos comandos, que sólo yo y <a href="http://es.wikipedia.org/wiki/Jon_%22maddog%22_Hall">Jon Maddog</a> conocemos, utilizo un gestor de ventanas para navegar por la web, ver vídeos, escuchar música y cosas así. Puedo unir la potencia de la línea de comandos con el atractivo visual de un entorno de ventanas. Gracias al comando <em>notify-send</em> podemos enviar mensajes a la bandeja del sistema como por ejemplo:</p>
<p><span id="more-471"></span></p>
<pre>$ notify-send "el comando $0 ha finalizado"</pre>
<p>Así puedes relajarte y ver las ultimas novedades de tus feeds mientras esperas que las máquinas sincronicen o termine de compilar el nuevo Kernel de Linux.</p>
<p>Podemos añadir opciones en la lista de comandos, como la prioridad del mensaje, el icono que aparece, el tiempo que se muestra, etc</p>
<p>Para instalarlo, </p>
<pre># apt-get install libnotify-bin</pre>
<p>Y a jugar!</p>
<p>En Python también disponemos de un sistema de notificaciones a través del módulo <em>pynotify</em> que es igual sólo que, tenemos que escribir un poco más en el código y se ve así, </p>
<pre>if pynotify.init("program name"):
  n = pynotify.Notification("Programa terminado")
  n.show()
else:
  print "there was a problem initializing the pynotify module"
</pre>
<p>Se inicializa la clase y se van añadiendo los atributos que correspondan, como en el caso anterior, la prioridad, el icono y el tiempo de exposición. Tenemos la posibilidad de contar con un control de errores por si algo falla no muestre una fea traza de llamadas.</p>
<p>Para instalarlo, </p>
<pre># apt-get install python-notify</pre>
<p>Y a notificar xD</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2010%2F06%2Fnotificaciones-en-bash-y-python%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Notificaciones en Bash y Python. via @nordri" data-url="http://www.muspells.net/blog/2010/06/notificaciones-en-bash-y-python/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/06/notificaciones-en-bash-y-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Control de Comandos</title>
		<link>http://www.muspells.net/blog/2010/06/control-de-comandos/</link>
		<comments>http://www.muspells.net/blog/2010/06/control-de-comandos/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 08:45:00 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux Script]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[fail control]]></category>
		<category><![CDATA[safe execution]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=462</guid>
		<description><![CDATA[No hay nada más molesto para un sysadmin que correr los scripts en algún sistema y que alguno de los comandos que forman parte del código no esté presente en el sistema. Así, disponemos de comandos que miran que otros comandos están o no están dando el correspondiente aviso y abortando la ejecución. La sintaxis [...]]]></description>
			<content:encoded><![CDATA[<p>No hay nada más molesto para un sysadmin que correr los scripts en algún sistema y que alguno de los comandos que forman parte del código no esté presente en el sistema. Así, disponemos de comandos que miran que otros comandos están o no están dando el correspondiente aviso y abortando la ejecución.</p>
<p><span id="more-462"></span></p>
<p>La sintaxis como sigue:</p>
<pre>command -v $COMANDO </pre>
<p>Un ejemplo:
<pre>$ command -v cp
/bin/cp</pre>
<p>Ahora uno que no existe</p>
<pre>$ command -v prueba
$ $?
1</pre>
<p>Vemos como responde con la ruta al ejecutable en éxito y pone a 1 el flag de error cuando no existe. ¿Cómo lo usamos en un script? Muy fácil
<p>Lo primero que necesitamos es una variable <i>CMDLIST</i> donde listamos los comandos que necesitamos</p>
<pre>CMDLIST="ls cp nmap echo cat";</pre>
<p>y creamos un bucle para comprobar que existen o salimos con algún mensaje de error que indique que comando falta.</p>
<pre>
for i in $CMDLIST
do
  command -v $i >/dev/null &#038;&#038; continue || { echo "$i command not found."; exit 1; }
done
</pre>
<p>Dependiendo de la funcionalidad del script, el echo de comprobar que todos los elementos están nos puede ahorrar algún disgusto como perdida de datos o de tiempo ya que en el peor de los casos, el comando que falta puede ser el último de un programa de lotes que tarde varias horas en completarse.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2010%2F06%2Fcontrol-de-comandos%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Control de Comandos. via @nordri" data-url="http://www.muspells.net/blog/2010/06/control-de-comandos/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/06/control-de-comandos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notificando Nuevas Series Compartidas</title>
		<link>http://www.muspells.net/blog/2010/05/notificando-nuevas-series-compartidas/</link>
		<comments>http://www.muspells.net/blog/2010/05/notificando-nuevas-series-compartidas/#comments</comments>
		<pubDate>Thu, 27 May 2010 19:12:31 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[consola]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[incron]]></category>
		<category><![CDATA[monitorizar]]></category>
		<category><![CDATA[torrent]]></category>
		<category><![CDATA[usuario]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=318</guid>
		<description><![CDATA[Como todo buen friki que se precie, sigo un montón de series, tantas que mis usuarios se pierden cada día buscando las novedades en la carpeta compartida por NFS que tengo en mi red. El directorio compartido es /mnt/almacen/Media, un Seagate Barracuda de 1TB, de ahí cuelgan las series cada una en su directorio, muy [...]]]></description>
			<content:encoded><![CDATA[<p>Como todo buen friki que se precie, sigo un montón de series, tantas que mis usuarios se pierden cada día buscando las novedades en la carpeta compartida por NFS que tengo en mi red. El directorio compartido es /mnt/almacen/Media, un Seagate Barracuda de 1TB, de ahí cuelgan las series cada una en su directorio, muy bien ordenado.</p>
<p>Pues bien, apoyandome en el demonio Incron, he creado un sistema para notificar por correo electrónico a mi lusers cada novedad. El problema es que incron no implementa todavía la recursividad sobre subdirectorios, así que hay que supervisar cada uno por separado.</p>
<p>Este es el contenido:</p>
<pre>
bigBangTheory            Dollhouse           House          Mental               Numbers         RobinsonCrusoe    TheBeast
Bones                    EntreFantasmas      Hung           MentesCriminales     Olvidados       RomaCriminal      TheITCrowd
cocheFantastico          Eureka              incoming       Mercy                PadreDeFamilia  SamanthaWho       TheListener
ComoConociAVuestraMadre  EverybodyHateChris  kyle           Mienteme             pelisVistas     scrubs            TorchWood
csi                      FlashForward        LaPeceraDeEva  Monk                 Psych           siesta            Trauma
Deadwood                 Greek               Life           MP3s                 Reaper          Simpson           TrueBlood
Dexter                   Heroes              LifeOnMars     MujeresDesesperadas  Ritchies        StargateAtlantis  videosChicos
Docus                    Historicas          meLlamoEarl    MyOwnWorstEnemy      RobinHood       supernatural      Weeds
</pre>
<p>Escribir una línea de incrontab para cada uno es algo que no estaba dispuesto a hacer, así que se recurre a find y awk.</p>
<pre>
find /mnt/almacen/Media/ -maxdepth 1 | awk '{ print $1 " IN_MOVED_TO /home/nordri/bin/incron/nuevoMedio.py $@ $# " }'
</pre>
<p>Este comando, que debemos redireccionar a un fichero, nos mostrará esto:</p>
<pre>
[...]
/mnt/almacen/Media/Mienteme IN_MOVED_TO /home/nordri/bin/incron/nuevoMedio.py $@ $#
[...]
</pre>
<p>Que creara un monitor para el directorio, en caso que algún fichero sea movido dentro del directorio, ejecutará el comando nuevoMedio.py con los parametros $@ y $# que son la ruta completa y el nombre del archivo.</p>
<p>Existen, también dos detalles, uno es el directorio <i>históricas</i> donde guardo las series finalizadas, canceladas y discontinuadas. Esto es porque me gusta saber que series he seguido. El otro detalle, es supervisar la raíz de Media para avisar en caso que se añada una nueva serie. Las líneas que hay que añadir al incrontab son las siguientes.
<pre>
/mnt/almacen/Media/Historicas IN_MOVED_TO /home/nordri/bin/incron/nuevoHistorico.py $#
/mnt/almacen/Media IN_CREATE /home/nordri/bin/incron/nuevoDirMedio.py $#
</pre>
<p>Bien, pasemos a la programación, todos los scripts son en el básico Python que manejo, pero que resulta útil para estas cuestiones. El script nuevoMedio.py</p>
<pre>
import avisoPorEmail
import sys
def getCategoria(t):
  c = t.split("/")
  l = len(c)
  return c[l-1]
categoria  = getCategoria(sys.argv[1])
email = open("/tmp/email", "w")
email.write("En la categoria : " + categoria + "\n\nSe ha compartido un nuevo archivo multimedia: \n\n" + sys.argv[2] + "\n\n enjoy <img src='http://www.muspells.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ")
email.close()
asunto = "Nuevo archivo multimedia"
direcciones = [ #direcciones# ]
avisoPorEmail.mail('/tmp/email', asunto, direcciones, 'txt')
</pre>
<p>Simplemente, recibe la ruta del directorio compartido, elimina las barras y nos quedamos el nombre de la serie, que será la categoría, el segundo parámetro es el nombre del archivo, que lleva consigo el episodio, y todo lo que los uploaders le añaden para autopromocionarse. Se escribe la cadena en un archivo y se manda por correo a las direcciones que se le indican en el array. Hay que avisar a los usuarios que miren en spam por si acaso. A mi me pasa.</p>
<p>Los scripts de nuevoDirMedio.py y nuevoHistorico.py son muy similares.</p>
<pre>
import avisoPorEmail
import sys
import os
categoria  = sys.argv[1]
email = open("/tmp/email", "w")
email.write("Se está siguiendo una nueva serie : " + categoria + "\n\n enjoy <img src='http://www.muspells.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ")
email.close()
asunto = "Nueva Serie"
direcciones = [ #direcciones# ]
# Dar de alta el nuevo directorio en incron
os.system('/home/nordri/bin/incron/nuevoDirVigilado.sh ' + categoria)
avisoPorEmail.mail('/tmp/email', asunto, direcciones, 'txt')
</pre>
<p>Prácticamente igual, la peculiaridad aquí está en que si creamos un nuevo directorio, debemos dar de alta el monitor para incron. Para ello utilizo el siguiente script.</p>
<pre>
echo "/mnt/almacen/Media/$1 IN_MOVED_TO /home/nordri/bin/incron/nuevoMedio.py \$@ \$#" > /tmp/tareaIncron.txt
incrontab -l >> /tmp/tareaIncron.txt
incrontab /tmp/tareaIncron.txt
</pre>
<p>Simple, no? Se escribe la tarea en un archivo auxiliar, se anexa el contenido del incrontab actual y se recarga usando el archivo auxiliar como base.</p>
<p>El último es para cuando una serie se pasa al histórico, así, </p>
<pre>
import avisoPorEmail
import sys
def getCategoria(t):
  c = t.split("/")
  l = len(c)
  return c[l-1]
categoria  = getCategoria(sys.argv[1])
email = open("/tmp/email", "w")
email.write("La serie : " + categoria + "\n\nHa sido cancelada o discontinuada. Perdone las molestias")
email.close()
asunto = "Serie abandonada"
direcciones = [ #Direcciones# ]
avisoPorEmail.mail('/tmp/email', asunto, direcciones, 'txt')
</pre>
<p>Pues bien, cada vez que algo se mueva del incoming del Torrent a su directorio se avisará a los usuarios con un correo electrónico. </p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2010%2F05%2Fnotificando-nuevas-series-compartidas%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Notificando Nuevas Series Compartidas. via @nordri" data-url="http://www.muspells.net/blog/2010/05/notificando-nuevas-series-compartidas/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/05/notificando-nuevas-series-compartidas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Midiendo La Curiosidad</title>
		<link>http://www.muspells.net/blog/2010/04/midiendo-la-curiosidad/</link>
		<comments>http://www.muspells.net/blog/2010/04/midiendo-la-curiosidad/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 19:00:26 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Curiosidades]]></category>
		<category><![CDATA[Es personal]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[estadistica]]></category>
		<category><![CDATA[ips]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=448</guid>
		<description><![CDATA[Después de un viaje decidí compartir con los amigos las fotos que hice. Es un archivo pesado y lo colgué del servidor así http://www.muspells.net/unarchivo.tar.gz La gente lo iba descargando, pero quería mirar cuan curiosos eran, como pasé la URL directa del archivo al darle click ya empieza la descarga. Así que me preguntaba cuantos de [...]]]></description>
			<content:encoded><![CDATA[<p>Después de un viaje decidí compartir con los amigos las fotos que hice. Es un archivo pesado y lo colgué del servidor así</p>
<pre>http://www.muspells.net/unarchivo.tar.gz</pre>
<p>La gente lo iba descargando, pero quería mirar cuan curiosos eran, como pasé la URL directa del archivo al darle click ya empieza la descarga. Así que me preguntaba cuantos de ellos borraron <i>unarchivo.tar.gz</i> y entraron a la dirección del sitio.<br />
Para ello, filtre las peticiones al archivo.</p>
<pre># grep unarchivo.tar.gz access.muspells.net.log | cut -d" " -f1 | sort | uniq </pre>
<p>Obteniendo una lista como esta:</p>
<pre>
88.55.66.33
77.5.47.5
...
</pre>
<p>La lista es un ejemplo, obviamente, me salían 29 IP&#8217;s únicas, ahora hay que cruzar los datos con las visitas a páginas legítimas del blog. Así</p>
<pre>IPS=$(grep unarchivo.tar.gz access.muspells.net.log | cut -d" " -f1 | sort | uniq)
for IP in $IPS
do
grep $IP access.muspells.net.log | grep -v unarchivo.tar.gz | cut -d" " -f1 | sort | uniq
done
</pre>
<p>Que nos da una lista con 9 direcciones IPs que son las personas que han descargado el archivo y han visitado alguna otra página.<br />
Esta estadística es chapucera, pero conociendo el tráfico que tiene el servidor y como son mis amigos, es muy fiable. Nos da que el 36% de mis amigos son curiosos en tecnología.<br />
Ahora voy a contar los que van a intentar descargar <i>unarchivo.tar.gz</i> dando el correspondiente 404.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2010%2F04%2Fmidiendo-la-curiosidad%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Midiendo La Curiosidad. via @nordri" data-url="http://www.muspells.net/blog/2010/04/midiendo-la-curiosidad/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/04/midiendo-la-curiosidad/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

