<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Trucos on Marco Antonio Blanco</title><link>https://marcoantonioblanco.es/categories/trucos/</link><description>Recent content in Trucos on Marco Antonio Blanco</description><generator>Hugo -- gohugo.io</generator><language>es-es</language><copyright>Marco Antonio Blanco</copyright><lastBuildDate>Fri, 07 Nov 2014 10:21:34 +0000</lastBuildDate><atom:link href="https://marcoantonioblanco.es/categories/trucos/index.xml" rel="self" type="application/rss+xml"/><item><title>Truco Linux: Cómo actualizar el contenido de ficheros de texto automáticamente con sed</title><link>https://marcoantonioblanco.es/2014/11/truco-linux-como-actualizar-el-contenido-de-ficheros-de-texto-automaticamente-con-sed/</link><pubDate>Fri, 07 Nov 2014 10:21:34 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/11/truco-linux-como-actualizar-el-contenido-de-ficheros-de-texto-automaticamente-con-sed/</guid><description>&lt;p&gt;Los administradores de sistemas Linux nos enfrentamos constantemente al problema de tener que cambiar un valor en varios ficheros de configuración a la vez, los cuales tienen siempre el formato de texto plano. Por ejemplo, si cambiamos la IP o el nombre de un equipo, hay que recorrerse todo el directorio &lt;code&gt;/etc&lt;/code&gt; en busca de ficheros que contengan una referencia al dato antiguo y cambiarla por el nuevo. Esto, que evidentemente es un proceso tedioso si hay que hacerlo a mano, podemos afortunadamente automatizarlo con una de las herramientas de procesamiento de texto que Linux incluye de serie y que ha heredado de Unix: &lt;code&gt;sed&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; es una utilidad de línea de comandos y nos permite con una sintaxis muy sencilla sustituir una cadena de texto por otra, que incluso permite utilizar expresiones regulares para aplicar la sustitución a patrones de cadenas. La operación más básica de &lt;code&gt;sed&lt;/code&gt; tendría la siguiente forma:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# sed &amp;#39;s/antigua/nueva/g&amp;#39; fichero_original &amp;gt; fichero_nuevo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si no queremos crear un fichero nuevo sino cambiar el existente, incluimos el parámetro &lt;code&gt;-i&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# sed -i &amp;#39;s/antigua/nueva/g&amp;#39; fichero_original &amp;gt; fichero_nuevo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Veamos entonces el ejemplo mencionado de tener que sustituir el nombre del sistema por uno nuevo. Para ello, realizaremos una búsqueda en &lt;code&gt;/etc&lt;/code&gt; y modificaremos los ficheros que contengan la cadena a cambiar.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# grep -r -H equipo1 /etc | cut -f 1 -d &amp;#34;:&amp;#34; | xargs sed -i &amp;#39;s/equipo1/equipo2/g&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En la línea anterior combinamos varios comandos Linux para prepara la lista de ficheros a procesar y obtener el resultado deseado con &lt;code&gt;sed&lt;/code&gt;:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;grep&lt;/code&gt; hace una búsqueda recursiva (&lt;code&gt;-r&lt;/code&gt;) en el directorio &lt;code&gt;/etc&lt;/code&gt; e imprime los nombres de lo ficheros coincidentes (&lt;code&gt;-H&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;cut&lt;/code&gt; extrae la primera columna (&lt;code&gt;-f&lt;/code&gt;) indicando &lt;code&gt;:&lt;/code&gt; como separador de las mismas (&lt;code&gt;-d&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;xargs&lt;/code&gt; recibe la lista de ficheros y se le pasa a &lt;code&gt;sed&lt;/code&gt; uno a uno (si no &lt;code&gt;sed&lt;/code&gt; actuaría sobre toda la lista a la vez, lo cual no puede hacer).&lt;/li&gt;&#10;&lt;li&gt;Finalmente &lt;code&gt;sed&lt;/code&gt; realiza la sustitución.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Este truco es también muy útil para los desarrolladores web, por ejemplo para actualizar plantillas o código fuente. Un aviso: hay que asegurarse de que la cadena a sustituir SÓLO aparece en los ficheros que nos interesan, ya que podemos sufrir el efecto secundario de cambiar lo que no deberíamos.&lt;/p&gt;&#10;&lt;p&gt;Espero que os sea de utilidad. Hasta el truco de la semana que viene.&lt;/p&gt;&#10;</description></item><item><title>Truco Linux: Cómo convertir masivamente entre formatos de imagen</title><link>https://marcoantonioblanco.es/2014/10/truco-linux-como-convertir-masivamente-entre-formatos-de-imagen/</link><pubDate>Fri, 31 Oct 2014 08:30:08 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/10/truco-linux-como-convertir-masivamente-entre-formatos-de-imagen/</guid><description>&lt;p&gt;&lt;a class="link" href="http://www.imagemagick.org/" target="_blank" rel="noopener"&#10; &gt;ImageMagick&lt;/a&gt; es un paquete de herramientas de línea de comandos para la manipulación de ficheros de imágenes. Es tal su potencia que se ha popularizado mucho su uso en servidores web como apoyo al &lt;em&gt;backend&lt;/em&gt; de los sitios alojados. En el truco de esta semana quiero centrarme en la que probablemente sea la herramienta más útil y conocida de las que ofrece ImageMagick: el conversor de formatos &lt;code&gt;convert&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Supongamos que tenemos un buen número de imágenes para publicar en nuestra web en un formato que no nos conviene. Basta con que realicemos un bucle sobre la lista de imágenes convirtiendo cada una al formato deseado.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ for i in *.jpg &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; do&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; echo &amp;#34;Convirtiendo $i...&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; convert -quality 75 $i $(basename $i .jpg).png&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; done&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En el ejemplo hemos hecho una conversión desde JPG a PNG con un nivel de compresión concreto (75) para los ficheros de destino. Como se puede apreciar en la línea del comando &lt;code&gt;convert&lt;/code&gt;, podemos incluir los parámetros que queramos para modificar el resultado a nuestro gusto. Dichos parámetros los podemos consultar en su manual electrónico (&lt;code&gt;man convert&lt;/code&gt;). Además, hemos extraído el nombre base de cada fichero con el comando &lt;code&gt;basename&lt;/code&gt; y le hemos añadido el sufijo &lt;code&gt;.png&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;La gran ventaja de &lt;code&gt;convert&lt;/code&gt; (aparte de su rapidez y versatilidad) es que, al ser una utilidad de línea de comandos, la podemos ejecutar directamente en el servidor web, sin tener que bajarnos las imágenes, procesarlas y subirlas de nuevo.&lt;/p&gt;&#10;&lt;p&gt;Por cierto, &lt;code&gt;convert&lt;/code&gt; no sólo convierte entre formatos de imagen, sino que también es capaz de realizar numerosas operaciones sobre imágenes: redimensionamiento, recorte, emborronamiento, optimización, rotación, unión, etc. La &lt;a class="link" href="http://www.imagemagick.org/script/convert.php" target="_blank" rel="noopener"&#10; &gt;lista completa de posibilidades&lt;/a&gt; se encuentra en su web oficial.&lt;/p&gt;&#10;&lt;p&gt;Si no contamos con &lt;code&gt;convert&lt;/code&gt; en nuestro sistema, basta con instalar ImageMagick. En Debian lo hacemos como habitualmente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get install imagemagick&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hasta el truco de la semana que viene.&lt;/p&gt;&#10;</description></item><item><title>Recomedaciones Linux de la semana (24/10/2014)</title><link>https://marcoantonioblanco.es/2014/10/recomedaciones-linux-de-la-semana-24102014/</link><pubDate>Fri, 24 Oct 2014 13:49:17 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/10/recomedaciones-linux-de-la-semana-24102014/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Ubuntu ha publicado esta semana una nueva versión de su distribución de escritorio. Se trata de la 14.10, que ha recibido el pintoresco seudónimo de &lt;a class="link" href="http://www.genbeta.com/linux/ubuntu-14-10-ya-esta-entre-nosotros-estas-son-las-novedades-de-utopic-unicorn" target="_blank" rel="noopener"&#10; &gt;Utopic Unicorn&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Ya que hablamos de Ubuntu, desde Ubuntizando nos recuerdan que el proyecto acaba de cumplir &lt;a class="link" href="http://www.ubuntizando.com/2014/10/20/ubuntu-cumple-10-anos/" target="_blank" rel="noopener"&#10; &gt;10 años de existencia&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;La Educación es siempre un tema candente y en Bitelia nos hablan de las &lt;a class="link" href="http://bitelia.com/2014/10/ventajas-utilizar-software-libre-educacion" target="_blank" rel="noopener"&#10; &gt;ventajas de utilizar Software Libre&lt;/a&gt; para ampliar las posibilidades de aprendizaje de los alumnos.&lt;/li&gt;&#10;&lt;li&gt;Desde LinuxParty nos informan de que &lt;a class="link" href="http://www.linux-party.com/index.php/85-energia/9208-ya-a-la-venta-sol-el-portatil-solar-con-linux-en-principio-ubuntu" target="_blank" rel="noopener"&#10; &gt;SoL, el portátil solar con Linux, ya está a la venta&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20141024/http://www.linuxadictos.com/las-empresas-de-softwar-libre-multiplican-su-empleo.html" target="_blank" rel="noopener"&#10; &gt;Las empresas de software libre multiplican su empleo&lt;/a&gt;, según nos cuentan desde linuxadictos.com.&lt;/li&gt;&#10;&lt;li&gt;Un interesante artículo sobre &lt;a class="link" href="https://web.archive.org/web/20141024/http://tuxapuntes.com/2014/10/iptraf-actividad-de-red-en-tiempo-real/" target="_blank" rel="noopener"&#10; &gt;cómo analizar la actividad de red en tiempo real con Iptraf&lt;/a&gt; es lo que nos ofrecen desde TuxApuntes esta semana.&lt;/li&gt;&#10;&lt;li&gt;Para todo el que se quiera iniciar en el mundo de la administración de sistemas Linux, en TecMint han publicado una &lt;a class="link" href="http://www.tecmint.com/learning-shell-scripting-language-a-guide-from-newbies-to-system-administrator/" target="_blank" rel="noopener"&#10; &gt;guía de introducción a la programación en &lt;em&gt;shell scripting&lt;/em&gt;&lt;/a&gt; (en inglés).&lt;/li&gt;&#10;&lt;li&gt;En Epoch Times han elaborado una curiosa lista con los &lt;a class="link" href="https://web.archive.org/web/20141024/http://www.theepochtimes.com/n3/1031947-5-deadly-linux-commands-you-should-never-run/" target="_blank" rel="noopener"&#10; &gt;5 comandos Linux más mortíferos&lt;/a&gt; que NUNCA se deberían ejecutar. Lo cierto es que dan mucho miedo&amp;hellip; (en inglés).&lt;/li&gt;&#10;&lt;li&gt;Y para terminar una noticia de ocio. GOG.com ha alcanzado la cifra de &lt;a class="link" href="http://www.gamingonlinux.com/articles/gog-now-have-over-100-linux-games-new-classics-include-baldurs-gate.4478" target="_blank" rel="noopener"&#10; &gt;100 juegos para Linux&lt;/a&gt; en su catálogo de descargas digitales, entre los que se incluyen clásicos imperecederos como Baldur&amp;rsquo;s Gate. ¡Habrá que probarlos! (en inglés).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Truco Linux: Cómo instalar un detector de malware en Linux</title><link>https://marcoantonioblanco.es/2014/10/truco-linux-como-instalar-un-detector-de-malware-en-linux/</link><pubDate>Thu, 23 Oct 2014 16:46:47 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/10/truco-linux-como-instalar-un-detector-de-malware-en-linux/</guid><description>&lt;p&gt;A pesar de ser un sistema operativo muy robusto frente a los virus, hasta el punto de haberse acuñado la frase &amp;ldquo;Linux no tiene virus&amp;rdquo;, es indudable que puede ser vulnerable a código malicioso desarrollado para atacar activamente sistemas basados en Linux y ante el que necesitamos protección. Por ello quiero dedicar el truco de esta semana a la instalación de un detector de &lt;em&gt;malware&lt;/em&gt;. El software elegido no tiene un nombre muy original que digamos. Se trata de &lt;a class="link" href="https://www.rfxn.com/projects/linux-malware-detect/" target="_blank" rel="noopener"&#10; &gt;Linux Malware Detect&lt;/a&gt; (LMD), un analizador de &lt;em&gt;malware&lt;/em&gt; para Linux de licencia libre diseñado para detectar amenazas en entornos de red.&lt;/p&gt;&#10;&lt;p&gt;Las instrucciones que voy a dar a continuación para instalar son en esta ocasión independientes de la distribución de destino. Como siempre que instalamos un software, hay que ejecutarlas como superusuario.&lt;/p&gt;&#10;&lt;p&gt;Empezamos descargándonos el paquete con la versión más actual. Afortunadamente, sus autores lo han nombrado genéricamente &lt;code&gt;maldetect-current.tar.gz&lt;/code&gt;, por lo que siempre estaremos seguros de bajarnos la última versión disponible. Por supuesto, la descarga la haremos en &lt;code&gt;/usr/local/src&lt;/code&gt;, el directorio estipulado en el estándar para estos menesteres.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# cd /usr/local/src&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# wget http://www.rfxn.com/downloads/maldetect-current.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Resolviendo www.rfxn.com (www.rfxn.com)... 129.121.132.46&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Conectando con www.rfxn.com (www.rfxn.com)[129.121.132.46]:80... conectado.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Petición HTTP enviada, esperando respuesta... 200 OK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# tar xzvf maldetect-current.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;maldetect-1.4.2/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;maldetect-1.4.2/CHANGELOG&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;maldetect-1.4.2/cron.daily&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;maldetect-1.4.2/README&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;maldetect-1.4.2/files/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una vez descargado y descomprimido el paquete, nos cambiamos al directorio que contiene el software y procedemos a instalar.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;# cd maldetect-1.4.2&lt;/code&gt;&lt;br&gt;&#10;&lt;code&gt;# ./install.sh&lt;/code&gt;&lt;br&gt;&#10;&lt;code&gt;Linux Malware Detect v1.4.2&lt;/code&gt;&lt;br&gt;&#10;&lt;code&gt;(C) 2002-2013, R-fx Networks&lt;/code&gt;&lt;br&gt;&#10;&lt;code&gt;(C) 2013, Ryan MacDonald&lt;/code&gt;&lt;br&gt;&#10;&lt;code&gt;inotifywait (C) 2007, Rohan McGovern&lt;/code&gt;&lt;br&gt;&#10;&lt;code&gt;This program may be freely redistributed under the terms of the GNU GPL&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;installation completed to /usr/local/maldetect&lt;br&gt;&#10;&amp;hellip;&lt;br&gt;&#10;maldet(6698): {sigup} signature set update completed&lt;br&gt;&#10;maldet(6698): {sigup} 11791 signatures (9899 MD5 / 1892 HEX)&lt;/p&gt;&#10;&lt;p&gt;Como podremos comprobar, no sólo se ha instalado el analizador sino que además se han actualizado sus bases de datos de firmas de &lt;em&gt;malware&lt;/em&gt;. Con esto ya está listo para su uso, que podemos hacer de dos formas, o bien puntualmente o bien como servicio del sistema. En cualquier caso, tendremos que hacerlo como superusuario.&lt;/p&gt;&#10;&lt;p&gt;Supongamos que queremos analizar /tmp de forma puntual e interactiva. Invocaremos LMD de la siguiente forma:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# maldet -a /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si preferimos que sea en segundo plano en vez de interactivamente, lo hacemos así:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# maldet -b /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y si queremos que LMD se ejecute como servicio del sistema:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# maldet -m /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;También podemos indicarle que monitorice los directorios domésticos de los usuarios:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# maldet -m users&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Evidentemente, si se reinicia el sistema, tendremos que arrancar LMD de nuevo a mano. Para ello, lo mejor es incluir su invocación en el script local de inicio del sistema, que en Debian es &lt;code&gt;/etc/rc.local&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Si queremos detener el servicio LMD, basta con el siguiente comando:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# maldet -k&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finalmente, podemos consultar los resultados de la monitorización en el fichero &lt;code&gt;/usr/local/maldetect/event_log&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Ah, y no olvidemos actualizar las bases de datos de firmas periódicamente con:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# maldet -u&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como es habitual, este comando lo podemos planificar a nuestra conveniencia mediante &lt;code&gt;cron&lt;/code&gt;. Hasta el truco de la semana que viene.&lt;/p&gt;&#10;</description></item><item><title>Truco Linux: Cómo comprobar si somos vulnerables al bug de BASH</title><link>https://marcoantonioblanco.es/2014/10/truco-linux-como-comprobar-si-somos-vulnerables-al-bug-de-bash/</link><pubDate>Thu, 16 Oct 2014 12:52:22 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/10/truco-linux-como-comprobar-si-somos-vulnerables-al-bug-de-bash/</guid><description>&lt;p&gt;Siendo sin duda el asunto más importante del año en cuestión de seguridad y sistemas informáticos, he pensado en seguir aportando mi granito de arena a luchar contra el bug de BASH y por ello quiero dedicar el truco Linux de esta semana a explicar cómo podemos comprobar de forma periódica si somos vulnerables a Shellshock o a alguna otra vulnerabilidad relacionada que pueda surgir en el futuro. Para ello vamos a utilizar un fantástico &lt;em&gt;script&lt;/em&gt; escrito por &lt;a class="link" href="https://github.com/hannob" target="_blank" rel="noopener"&#10; &gt;Hanno Böck&lt;/a&gt; y que publica en su repositorio público de GitHub.&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/hannob/bashcheck" target="_blank" rel="noopener"&#10; &gt;bashcheck&lt;/a&gt;, que así se llama el &lt;em&gt;script&lt;/em&gt;, realiza un serie de comprobaciones en el sistema en el que se ejecuta para analizar si sufre de alguna de las 6 vulnerabilidades publicadas a fecha de este artículo. Veamos cómo instalar el &lt;em&gt;script&lt;/em&gt; en nuestros sistemas, mantenerlo actualizado y ejecutarlo periódicamente para que nos informe por email de si alguno es vulnerable o no.&lt;/p&gt;&#10;&lt;p&gt;Empezamos con la instalación de bashcheck. Como ya he dicho, el proyecto se encuentra alojado en un repositorio de GitHub, lo que nos podría hacer pensar que la opción más directa para descargar el script sea hacer uso de Git. Pero teniendo en cuenta que sólo vamos a descargar un fichero, que Git no suele venir instalado de serie en las distribuciones Linux más populares y que no es precisamente un software fácil de utilizar sin experiencia previa, creo que es mejor utilizar alguna herramienta más sencilla pero potente que sí esté ya instalada en nuestro Linux y que nos evite el tener que &amp;ldquo;contaminar&amp;rdquo; nuestro sistema con la instalación de un software que va a tener un uso tan marginal.&lt;/p&gt;&#10;&lt;p&gt;Para estos casos yo prefiero utilizar Wget, el cual permite descargarse un fichero sólo si ha sido actualizado. Sin embargo, GitHub no nos lo va a poner fácil en este sentido, ya que ni nos deja descargarnos un único fichero a nuestra elección sino todo el repositorio completo, ni sirve la información temporal necesaria como para que Wget o cualquier otra herramienta pueda comprobar si efectivamente el fichero disponible es más moderno que el que ya tenemos descargado. Por ello vamos a tener que sortear estos obstáculos a través del siguiente script que he preparado para la ocasión:&lt;br&gt;&#10;{code type=php}&lt;br&gt;&#10;#!/bin/bash&lt;br&gt;&#10;#&lt;br&gt;&#10;# descargar_bashcheck.sh&lt;br&gt;&#10;# Descarga bashcheck desde GitHub e instala si es una nueva version&lt;br&gt;&#10;# 2014 (C) Activa Sistemas&lt;br&gt;&#10;# Este script se distribuye bajo licencia GPL&lt;br&gt;&#10;#&lt;br&gt;&#10;STAMP=$(date +%Y-%m-%d)&lt;br&gt;&#10;echo &amp;ldquo;Descargando bashcheck&amp;hellip;&amp;rdquo;&lt;br&gt;&#10;wget &amp;ndash;quiet &lt;a class="link" href="https://github.com/hannob/bashcheck/archive/master.zip" target="_blank" rel="noopener"&#10; &gt;https://github.com/hannob/bashcheck/archive/master.zip&lt;/a&gt; -O /tmp/bashcheck_$STAMP.zip&lt;br&gt;&#10;unzip -o -q -j /tmp/bashcheck_$STAMP.zip bashcheck-master/bashcheck -d /usr/local/tmp&lt;br&gt;&#10;rm /tmp/bashcheck_$STAMP.zip&lt;br&gt;&#10;diff -q /usr/local/tmp/bashcheck /usr/local/bin/bashcheck 2&amp;gt; /dev/null&lt;br&gt;&#10;if [ $? != 0 ]&lt;br&gt;&#10;then&lt;br&gt;&#10;echo &amp;ldquo;Actualizando bashcheck&amp;hellip;&amp;rdquo;&lt;br&gt;&#10;mv /usr/local/tmp/bashcheck /usr/local/bin/bashcheck&lt;br&gt;&#10;chmod 755 /usr/local/bin/bashcheck&lt;br&gt;&#10;chown root.root /usr/local/bin/bashcheck&lt;br&gt;&#10;echo &amp;ldquo;Nuevo bashcheck listo para su uso&amp;rdquo;&lt;br&gt;&#10;else&lt;br&gt;&#10;echo &amp;ldquo;No es necesario actualizar bashcheck&amp;rdquo;&lt;br&gt;&#10;fi&lt;br&gt;&#10;{/code}&lt;/p&gt;&#10;&lt;p&gt;Guardamos el código en un fichero que llamaremos &lt;code&gt;descargar_bashcheck.sh&lt;/code&gt;, lo almacenamos en &lt;code&gt;/usr/local/bin&lt;/code&gt; (donde deben ir las herramientas propias que desarrollemos) y le otorgamos permisos de ejecución:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# chmod 755 /usr/local/bin/descargar_bashcheck.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lo ejecutamos por primera vez para comprobar que todo es correcto y que se descarga la última versión disponible de bashcheck:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /usr/local/bin/descargar_bashcheck.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Descargando bashcheck...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Actualizando bashcheck...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Nuevo bashcheck listo para su uso&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ls -l /usr/local/bin/bashcheck&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rwxr-xr-x 1 root root 2889 oct 13 10:48 /usr/local/bin/bashcheck&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El último paso es asegurarnos de que se mantiene actualizado y que se ejecuta diariamente para avisarnos de eventuales vulnerabilidades. Para ello, programamos un par de tareas con cron. Aunque el usuario root cuenta con su propia lista de tareas programadas, personalmente prefiero dar de alta las tareas generales del sistema en el fichero &lt;code&gt;/etc/crontab&lt;/code&gt;, en el que insertaremos las siguientes líneas:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# bashcheck&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00 07 * * * root /usr/local/bin/descargar_bashcheck.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;30 07 * * * root /usr/local/bin/bashcheck | mail -s &amp;#34;Resultado analisis bashcheck&amp;#34; alguien@ejemplo.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con esto habremos programado la ejecución diaria de ambas tareas a las 7:00 y las 7:30, respectivamente, y enviaremos por email el resultado de bashcheck a la dirección que queremos. Os dejo como ejercicio hacer que bashcheck sólo mande el email si el resultado del test es positivo, es decir, se ha encontrado una vulnerabilidad en el sistema.&lt;/p&gt;&#10;&lt;p&gt;Para el que tenga a su cargo un buen número de sistemas y se pregunte cómo copiar descargar_bashcheck.sh y modificar el crontab en cada uno de manera automática y con el menor esfuerzo posible, le diré que la mejor manera es a través de un buen software de gestión automatizada de sistemas, como Chef, Ansible, Salt o, mi favorito, &lt;a class="link" href="https://web.archive.org/web/20141016/https://puppetlabs.com/" target="_blank" rel="noopener"&#10; &gt;Puppet&lt;/a&gt;. Evidentemente, una herramienta así también nos sirve para aplicar parches si bashcheck nos avisa de una nueva vulnerabilidad.&lt;/p&gt;&#10;&lt;p&gt;Para terminar, una anécdota: tanto bashcheck como descargar_bashcheck.sh están escritos en BASH ;) ¡Hasta el truco de la semana que viene!&lt;/p&gt;&#10;</description></item><item><title>Truco Linux: Los comandos internos de BASH</title><link>https://marcoantonioblanco.es/2014/10/truco-linux-los-comandos-internos-de-bash/</link><pubDate>Thu, 09 Oct 2014 16:40:06 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/10/truco-linux-los-comandos-internos-de-bash/</guid><description>&lt;p&gt;Con la que le está cayendo estos días a BASH con las infames vulnerabilidades que se le están descubriendo, he pensado dedicar el truco de esta semana a romper una lanza a favor de este fabuloso intérprete de comandos. A pesar de los problemas que nos está provocando a los administradores de sistemas, no podemos olvidar las enormes posibilidades de BASH y lo que nos ha facilitado la vida hasta la fecha. Una de estas capacidades avanzadas es lo que se conoce como los comandos (u órdenes) internos de la &lt;em&gt;shell&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;BASH incluye un buen número de comandos internos, algunos de los cuales son versiones reducidas de los que aparecen en el paquete &lt;code&gt;coreutils&lt;/code&gt; de GNU, tales como &lt;code&gt;echo&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt; o &lt;code&gt;kill&lt;/code&gt;, mientras que otros sólo existen dentro de BASH, como &lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;alias&lt;/code&gt;, &lt;code&gt;pushd&lt;/code&gt;, &lt;code&gt;popd&lt;/code&gt;, &lt;code&gt;exec&lt;/code&gt; o &lt;code&gt;trap&lt;/code&gt;. Para comprobar si un comando es interno y si tiene una contrapartida externa se utiliza el comando &lt;code&gt;type&lt;/code&gt;, que por cierto es sólo interno:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ type -a echo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo es una orden interna del shell&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo is /bin/echo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ type -a cd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd es una orden interna del shell&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ type -a mkdir&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir is /bin/mkdir&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Según las prioridades de ejecución de BASH, un comando interno siempre se ejecuta antes. Por tanto, ¿qué ventajas tiene esto? Por una parte una mayor rapidez de ejecución y un menor consumo de recursos y por otra parte la seguridad de poder ejecutar el comando aunque el sistema esté colapsado. Por ejemplo, si el sistema ha llegado al máximo de procesos en ejecución y queremos matar algunos, no podremos utilizar &lt;code&gt;/bin/kill&lt;/code&gt; pero sí el comando interno &lt;code&gt;kill&lt;/code&gt;. A cambio, como ya he dicho al principio, los comandos internos &amp;ldquo;repetidos&amp;rdquo; tienen menores capacidades que sus equivalentes externos.&lt;/p&gt;&#10;</description></item><item><title>Truco Linux: Extraer un clip de un vídeo</title><link>https://marcoantonioblanco.es/2014/10/truco-linux-extraer-un-clip-de-un-video/</link><pubDate>Thu, 02 Oct 2014 12:30:59 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/10/truco-linux-extraer-un-clip-de-un-video/</guid><description>&lt;p&gt;Esta semana os traigo una pequeña receta para extraer una parte concreta (un clip) de un fichero de vídeo en Linux. Para ello vamos a ver cómo hacerlo con dos herramientas diferentes de licencia libre, de forma que podamos elegir posteriormente la que más nos interese o, sencillamente, la que tengamos disponible.&lt;/p&gt;&#10;&lt;p&gt;Para ilustrar este truco vamos a suponer que queremos obtener un extracto de un vídeo en formato FLV a partir de una posición temporal y de una duración determinada, primero respetando los códecs de audio y vídeo originales y después convirtiéndolos a otros formatos más abiertos y estándares&lt;/p&gt;&#10;&lt;p&gt;En primer lugar vamos a extraer el clip con &lt;a class="link" href="http://ffmpeg.org/" target="_blank" rel="noopener"&#10; &gt;FFmpeg&lt;/a&gt;, un completo proyecto que incluye utilidades y librerías para la producción y gestión de activos multimedia y cuya herramienta de línea de comandos está considerada como toda una navaja suiza. En Debian instalamos FFmpeg con &lt;code&gt;apt-get install ffmpeg&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Copiando los códecs originales:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ffmpeg -ss 00:31:25 -i video_original.flv -vcodec copy -acodec copy -bsf h264_mp4toannexb -t 00:02:30 clip_video.flv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Convirtiendo los códecs:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ffmpeg -ss 00:31:25 -i video_original.flv -vcodec libxvid -acodec pcm -t 00:02:30 clip_video.avi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Como se puede ver, establecemos el punto de inicio del clip con el parámetro &lt;code&gt;-ss&lt;/code&gt; y la duración con &lt;code&gt;-t&lt;/code&gt;, mientras que el parámetro &lt;code&gt;-bsf h264_mp4toannexb&lt;/code&gt; sólo es necesario en el caso de vídeos FLV. Asimismo, es muy importante respetar el orden de los parámetros tal y como aparecen en los ejemplos.&lt;/p&gt;&#10;&lt;p&gt;La segunda opción es MEncoder, una utilidad de línea de comandos que forma parte del proyecto &lt;a class="link" href="https://web.archive.org/web/20141002/http://www.mplayerhq.hu" target="_blank" rel="noopener"&#10; &gt;MPlayer&lt;/a&gt;, el popular reproductor multimedia. En Debian instalamos MEncoder con &lt;code&gt;apt-get install mencoder&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Copiando los códecs originales:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mencoder -ss 00:31:25 -endpos 150 -oac copy -ovc copy video_original.flv -o clip_video.flv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Convirtiendo los códecs:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mencoder -ss 00:31:25 -endpos 150 -oac pcm -ovc lavc video_original.avi -o clip_video.avi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este caso, se establece igualmente el punto de inicio del clip con el parámetro &lt;code&gt;-ss&lt;/code&gt;, pero la duración se especifica con &lt;code&gt;-endpos&lt;/code&gt; en segundos. Asimismo, también es muy importante respetar el orden de los parámetros tal y como aparecen en los ejemplos.&lt;/p&gt;&#10;&lt;p&gt;Ambas herramientas se encuentran disponibles en los repositorios oficiales de Debian, pero existen versiones más modernas y completas en los de &lt;a class="link" href="http://deb-multimedia.org/" target="_blank" rel="noopener"&#10; &gt;Debian Multimedia&lt;/a&gt;, las cuales recomiendo instalar.&lt;/p&gt;&#10;&lt;p&gt;Elegir una u otra opción va a depender, como decía al principio, de nuestras necesidades y de la disponibilidad de cada herramienta en nuestra plataforma de elección. Eso sí, en mis pruebas FFmpeg suele generar ficheros más pequeños y no suele necesitar de códecs externos, por lo que suele ser mi preferido.&lt;/p&gt;&#10;&lt;p&gt;Existen más utilidades, tanto de línea de comandos (Transcode) como gráficas (Avidemux, HandBrake), pero o bien no producen tan buenos resultados como FFmpeg y MEncoder o bien se basan en ellas para funcionar, por lo que al final es mejor usarlas directamente.&lt;/p&gt;&#10;&lt;p&gt;¡Hasta el truco de la semana que viene!&lt;/p&gt;&#10;</description></item><item><title>Truco Linux: Los huevos de pascua de Debian</title><link>https://marcoantonioblanco.es/2014/09/truco-linux-los-huevos-de-pascua-de-debian/</link><pubDate>Thu, 25 Sep 2014 15:58:01 +0000</pubDate><guid>https://marcoantonioblanco.es/2014/09/truco-linux-los-huevos-de-pascua-de-debian/</guid><description>&lt;p&gt;Para inaugurar esta nueva sección nada mejor que una curiosidad de mi distribución Linux favorita, que no es otra que Debian. Como buen producto fabricado por &lt;em&gt;geeks&lt;/em&gt;, tecnofans y programadores, Debian Linux incluye oculto en su interior un buen número de Huevos de Pascua (para quien no lo sepa, los &lt;em&gt;Easter Eggs&lt;/em&gt; son contenidos y funcionalidades escondidas en software y productos multimedia, generalmente con un sentido humorístico, de diversión o de homenaje, aunque a veces se utilizan como mecanismo reivindicativo). Veamos qué &amp;ldquo;secretos&amp;rdquo; calla Debian&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;Los huevos de pascua de Debian están relacionados con las herramientas de gestión de software. Comencemos con la más básica, &lt;code&gt;apt-get&lt;/code&gt;. Si invocamos su ayuda en línea, &lt;code&gt;apt-get&lt;/code&gt; nos informa de lo siguiente:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Usage: apt-get [options] command&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get [options] install|remove pkg1 [pkg2 ...]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt-get [options] source pkg1 [pkg2 ...]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; This APT has Super Cow Powers.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Así que APT tiene poderes de super vaca&amp;hellip; Vamos a preguntarle por más detalles:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# apt-get moo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;         (__) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;         (oo) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;   /------\/ &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  / |    ||   &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *  /\---/\ &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    ~~   ~~   &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;....&amp;#34;Have you mooed today?&amp;#34;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bonita vaca :)&lt;/p&gt;&#10;&lt;p&gt;Si &lt;code&gt;apt-get&lt;/code&gt; tiene un huevo de pascua, entonces seguro que &lt;code&gt;aptitude&lt;/code&gt; también, ¿no?&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# aptitude moo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No hay ningún huevo de pascua en este programa.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bueno, aunque lo &lt;code&gt;aptitude&lt;/code&gt; niegue, esto es un huevo de pascua en toda regla. Vamos a insistirle:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# aptitude -v moo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Realmente no hay ningún huevo de pascua en este programa.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# aptitude -vv moo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;¿No le he dicho ya que no hay ningún huevo de pascua en este programa?&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# aptitude -vvv moo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;¡Deje de hacer eso!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# aptitude -vvvv moo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Vale, vale, si le doy un huevo de pascua, ¿se irá?&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# aptitude -vvvvv moo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;De acuerdo, usted gana.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /----\&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -------/ \&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / \&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; / |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -----------------/ --------\&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ----------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@rivendel:~# aptitude -vvvvvv moo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;¿Qué es? Un elefante siendo devorado por una serpiente, evidentemente.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un gran huevo de pascua sin duda, muy elaborado, con una fantástica referencia literaria (para quién no la reconozca, se trata de &amp;ldquo;&lt;a class="link" href="https://es.wikipedia.org/wiki/El_principito" target="_blank" rel="noopener"&#10; &gt;El Principito&lt;/a&gt;&amp;rdquo;) y en español. ¿Qué más se puede pedir?&lt;/p&gt;&#10;&lt;p&gt;Espero que os haya gustado esta curiosidad para inaugurar esta sección. Nos vemos en el truco de la semana que viene.&lt;/p&gt;&#10;</description></item></channel></rss>