<?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; Linux Script</title>
	<atom:link href="http://www.muspells.net/blog/category/linux-script/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>Ejecutar Comandos con un Usuario sin Shell Válida</title>
		<link>http://www.muspells.net/blog/2011/11/ejecutar-comandos-con-un-usuario-sin-shell-valida/</link>
		<comments>http://www.muspells.net/blog/2011/11/ejecutar-comandos-con-un-usuario-sin-shell-valida/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 08:29:23 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux Script]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[su]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=1060</guid>
		<description><![CDATA[Si tenemos en el sistema usuarios sin shell válida como por ejemplo los usuarios que acceden por FTP o que lanzan demonios y queremos ejecutar algún comando con ellos como por ejemplo actualizar su tabla de tareas de Cron, podemos hacerlo de la siguiente manera: # su $USER -c comando -s /bin/bash En este caso, [...]]]></description>
			<content:encoded><![CDATA[<p>Si tenemos en el sistema usuarios sin shell válida como por ejemplo los usuarios que acceden por FTP o que lanzan demonios y queremos ejecutar algún comando con ellos como por ejemplo actualizar su tabla de tareas de Cron, podemos hacerlo de la siguiente manera:</p>
<pre># su $USER -c comando -s /bin/bash</pre>
<p>En este caso, ejecutara el comando bajo la shell bash.</p>
<p>Como hemos dicho, para alterar la tabla de Cron hacemos.</p>
<pre># su $USER -c "crontab -e" -s /bin/bash</pre>
<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%2F11%2Fejecutar-comandos-con-un-usuario-sin-shell-valida%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="Ejecutar Comandos con un Usuario sin Shell Válida. via @nordri" data-url="http://www.muspells.net/blog/2011/11/ejecutar-comandos-con-un-usuario-sin-shell-valida/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/11/ejecutar-comandos-con-un-usuario-sin-shell-valida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ordenar Fotos por Tamaños</title>
		<link>http://www.muspells.net/blog/2011/03/ordenar-fotos-por-tamanos/</link>
		<comments>http://www.muspells.net/blog/2011/03/ordenar-fotos-por-tamanos/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 18:57:17 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux Script]]></category>
		<category><![CDATA[automatización]]></category>
		<category><![CDATA[clasificar fotos]]></category>
		<category><![CDATA[imagemagick]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=893</guid>
		<description><![CDATA[Es casi una regla que el informático de turno de una empresa se tiene que comer unos marrones a cada cual más raro y exótico, el de hoy ha sido ordenar por tamaño unas 15.000 fotos, así, en frío. Para resolverlo, tenemos dos opciones, ir una a una mirando el tamaño y clasificarla o ser [...]]]></description>
			<content:encoded><![CDATA[<p>Es casi una regla que el informático de turno de una empresa se tiene que comer unos marrones a cada cual más raro y exótico, el de hoy ha sido ordenar por tamaño unas 15.000 fotos, así, en frío. Para resolverlo, tenemos dos opciones, ir una a una mirando el tamaño y clasificarla o ser listos y utilizar un programa que lo haga por nosotros.</p>
<p>Yo opté por escribir un pequeño script de Bash para resolver el problema, se identifica el archivo por su tamaño, y se traslada a donde queramos, en este caso particular vamos a discriminar por tres opciones,</p>
<ol>
<li>Más anchas que 1080px</li>
<li>Más altas que 1920px</li>
<li>Las pequeñas</li>
</ol>
<p>Para identificar una imagen usamos el comando <em>identify</em> que sin parámetros nos mostrará una salida así:</p>
<pre>
# identify foto.png
foto.png JPEG 1312x984 1312x984+0+0 8-bit DirectClass 233KB 0.000u 0:00.000
</pre>
<p>Forma parte de <strong>ImageMagick</strong>, debes instalarlo para usar el comando <em>identify</em></p>
<p>Pero para este caso le pasamos el parámetro <em>format</em> para que la salida sólo muestre lo que nos interese:</em></p>
<pre>
# identify -format "%w,%h" foto.png
1312,984
</pre>
<p>Ya con los valores de ancho y alto podemos escribir un bucle que lo haga por cada foto,</p>
<pre>
#!/bin/bash
# Ordena fotos por alto, ancho y otras
# Fede Diaz, Marzo 2011

TARGET="/path/to/output"
SOURCE="/path/to/input"

mkdir -p $TARGET/{anchas,altas,otras};

for FILE in $(ls $SOURCE);
do
  PROP=$(identify -format "%w,%h" $FILE);
  WEIGHT=$(echo $PROP | cut -d, -f1);
  HEIGHT=$(echo $PROP | cut -d, -f2);

  if [ $WEIGHT -gt 1080 ]; then
    mv $FILE $TARGET/anchas/;
  elif [ $HEIGHT -gt 1920 ]; then
    mv $FILE $TARGET/altas/;
  else
    mv $FILE $TARGET/otras/;
  fi
done
</pre>
<p>Y tardó bastante en procesar todas las fotos, pero siempre es mejor que el trabajo manual.</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%2F03%2Fordenar-fotos-por-tamanos%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="Ordenar Fotos por Tamaños. via @nordri" data-url="http://www.muspells.net/blog/2011/03/ordenar-fotos-por-tamanos/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/03/ordenar-fotos-por-tamanos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Backup de Clientes Windows en Servidores Linux</title>
		<link>http://www.muspells.net/blog/2010/06/backup-de-clientes-windows-en-servidores-linux/</link>
		<comments>http://www.muspells.net/blog/2010/06/backup-de-clientes-windows-en-servidores-linux/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 16:47:12 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Linux Script]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[redes mixtas]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[zentyal]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=486</guid>
		<description><![CDATA[Estaba yo dándole vueltas a como arreglar la historia de hacer copias de seguridad de las máquinas de los usuarios. Hasta ahora había probado Unison y una versión de RSync para Windows, pero no estaba satisfecho. El problema se producía al intentar copiar ficheros que estaban fuera del directorio de usuario, en windows es %USER% [...]]]></description>
			<content:encoded><![CDATA[<p>Estaba yo dándole vueltas a como arreglar la historia de hacer copias de seguridad de las máquinas de los usuarios. Hasta ahora había probado Unison y una versión de RSync para Windows, pero no estaba satisfecho. El problema se producía al intentar copiar ficheros que estaban fuera del directorio de usuario, en windows es %USER% o algo así, de vez en cuando, había que hacer una modificación a esos archivos para darles &#8220;Control total&#8221;. Hay que sumar, que mis usuarios son los de contraseñas basadas en gruesos algoritmos de cifrado, efectivamente, 1234 es la más común, así que no pueden iniciar sesión en el servidor, sólo transferencia por sftp con chroot a su $HOME.</p>
<p><span id="more-486"></span></p>
<p>Como el hecho de copiar del cliente al servidor no estaba funcionando, plantee hacer lo contrario. Compartí en la red los directorios a copiar, aquí podemos establecer el número máximo de usuarios que se pueden conectar y poner a uno por mejorar un poco la seguridad, ya que al montarlos en el servidor quedaran bloqueados. Una vez montados en el servidor, se hace la copia con el todo poderoso RSync.</p>
<p>Para montar la infraestructura planteamos el siguiente escenario:</p>
<pre>Server: 192.168.0.2 server.example.com
Cliente: 192.168.0.3 client.example.com
Usuario: charly
Password: 1234
Directorio: D:\Mis datos\
</pre>
<p>En Windows, nos movemos hasta el directorio que queremos compartir,</p>
<p><a href="http://www.muspells.net/blog/wp-content/uploads/2010/06/1W-Vision.png"><img class="aligncenter size-full wp-image-488" title="Directorio" src="http://www.muspells.net/blog/wp-content/uploads/2010/06/1W-Vision.png" alt="Directorio" width="353" height="366" /></a></p>
<p>Configuramos la compartición</p>
<p><a href="http://www.muspells.net/blog/wp-content/uploads/2010/06/2WCompartir.png"><img class="aligncenter size-full wp-image-489" title="Compartir" src="http://www.muspells.net/blog/wp-content/uploads/2010/06/2WCompartir.png" alt="Compartir" width="427" height="455" /></a></p>
<p>Al ponerle el nombre a la compartición evito las mayúsculas y los espacios, para los scripts es muy negativo que los nombres de ficheros tengan espacios y caracteres especiales como acentos, eñes, diéresis, etc. Pasamos al servidor.</p>
<p>Me ha sorprendido, pero la plataforma EBox no incluía de serie los paquetes necesarios para nuestra tarea, así que tendremos que instalarlos</p>
<pre>apt-get install smbclient smbfs</pre>
<p>Aunque el paquete <em>smbclient</em> no es necesario, siempre está bien tenerlo a mano para comprobar cosas. <em>smbfs</em> es el módulo que nos permitirá montar directorios compartidos Windows en nuestro servidor.</p>
<p>Editamos <em>/etc/hosts</em></p>
<pre>127.0.0.1	localhost
192.168.0.2	server.example.com	server
192.168.0.3	client.example.com	client
</pre>
<p>Desde Windows la tarea de traducir nombres de máquinas a direcciones IP se encarga el protocolo NETBIOS, en Linux podemos montarlo, pero para este caso se sale del objetivo.</p>
<p>A continuación vamos a crear un archivo de texto con las credenciales del usuario, como esto va de Samba lo vamos a guardar en el directorio de configuración de Samba, me parece lo más lógico,</p>
<pre># vim /etc/samba/credenciales
Añadimos
username=charly
password=1234
Modificamos los permisos
# chmod 0600 /etc/samba/credenciales</pre>
<p>Un archivo de credenciales por usuario. Tened en cuenta los permisos.</p>
<p>Ahora editamos el fichero de puntos de montaje,</p>
<pre># vim /etc/fstab
añadimos
//client/misdatos       /mnt/charly  cifs   defaults,noatime,uid=3008,gid=1000,credentials=/etc/samba/credenciales  0 0
</pre>
<p>Hemos definido un punto de montaje en <em>/mnt/charly</em> para montar la compartición, se establecen los uid y gid para que la compatición se monte con el id y gid de usuario correcto y se le pasan las credenciales con el nombre de usuario y la contraseña para que podamos montarla.</p>
<p>Ahora vamos a escribir un script en <em>/usr/local/bin/copia-charly</em> para que se haga la copia, tendría más o menos esta pinta:</p>
<pre>#!/bin/bash
# Copia de seguridad de usuario
# Fede Diaz nordri_gmail_com Junio 2010

PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/home/nordri/bin

DATE=$(date +"%d%m%Y");
LOGFILE="/var/log/rsync/rsync-${DATE}-charly.log"
RSYNCOPT="--archive --perms --times --progress --log-file=$LOGFILE"

/usr/bin/rsync $RSYNCOPT /mnt/charly/ /home/charly/backup;
</pre>
<p>Y le damos permisos de ejecución</p>
<pre># chmod +x /usr/local/bin/copia-charly</pre>
<p>Lo ponemos en una tarea de cron, por ejemplo, de Lunes a Viernes a las 15.</p>
<pre># crontab -e
Añadimos
0 15 * * 1,2,3,4,5 /usr/local/bin/copia-charly
</pre>
<p>Deberiamos disponer de un control de errores en caso que la compartición no esté montada, para ello nos apoyaríamos en el fichero <em>/etc/mtab</em> que es la lista de lo que está montado, con esto y <em>grep</em> nuestro script quedaría como esto:</p>
<pre>#!/bin/bash
# Copia de seguridad de usuario
# Fede Diaz nordri_gmail_com Junio 2010

PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/home/nordri/bin

DATE=$(date +"%d%m%Y");
LOGFILE="/var/log/rsync/rsync-${DATE}-charly.log"
RSYNCOPT="--archive --perms --times --progress --log-file=$LOGFILE"

grep -q charly /etc/mtab;

if [ $? == 1 ]; then
  echo "La comparticion no está montada" &gt; $LOGFILE;
  exit 1;
fi
/usr/bin/rsync $RSYNCOPT /mnt/charly/ /home/charly/backup;
</pre>
<p>Podemos mejorar aun más si al detectar que no está montada, intentamos montarla en ese momento, pero hay que tener cuidado, puede haber problemas en la red, y acabar montando un follón.</p>
<p>Y esto es todo, podemos ir haciendo lo mismo para cada usuario del que queramos copiar archivos al servidor.</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%2Fbackup-de-clientes-windows-en-servidores-linux%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="Backup de Clientes Windows en Servidores Linux. via @nordri" data-url="http://www.muspells.net/blog/2010/06/backup-de-clientes-windows-en-servidores-linux/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/06/backup-de-clientes-windows-en-servidores-linux/feed/</wfw:commentRss>
		<slash:comments>3</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>
	</channel>
</rss>

