Uso avanzado de Find y Grep

Durante todos mis años de desarrollado LAMP, han habido una serie de comandos UNIX que me han sido muy útiles. En este artículo voy a compartir unos ejemplos de su uso que van más allá de su empleo básico, con el objetivo de que sirva de ayuda para otros desarrolladores. En esta ocasión voy a centrarme en find y grep, más adelante me gustaría ampliar este artículo con otros comandos que facilitan la vida al programador y al usuario de Unix / Linux en general.

Entrada, salida y su redireccionamiento

Antes de empezar, no estaría de más, para una mayor claridad de los ejemplos, explicar que en Unix el standard output (salida) e input (entrada) es la consola. Debemos tenerlo en cuenta para redireccionar tanto la salida como la entrada de datos de las órdenes mediante pipelines ( < > | )

find y grep

Grep es una poderosa herramienta que nos permite encontrar coincidencias dentro de un fichero o de un conjunto de ellos, gran parte de sus “superpoderes” emanan de las expresiones regulares. A continuación, veamos unos ejemplos de su uso para búsquedas no muy elementales:

– En primer lugar, con grep hay que escapar los caracteres especiales:

grep "regex|regex not" borrame.txt  => grep "regex\|regex not" borrame.txt

– Si no se quiere escaparlos para que no los entienda como parte de la cadena buscada, debemos usar la opcion -E o bien egrep:

grep -E "regex|regex not" borrame.txt

egrep "regex|regex not" borrame.txt

– Para buscar una cadena de texto en ficheros filtrados recursivamente:

grep -r --include="*.php" "yorkshiresConfig.ini" * > resultados.txt

Esta orden buscaría recursivamente, a través de todos los subdirectorios, la cadena “yorkshiresConfig.ini” en todos los ficheros con extensión php.

El nombre de la orden find ya nos dice todo acerca de su función. Se vuelve realmente poderosa cuando se combina con otras órdenes. He aquí algunos ejemplos:

– Para borrar ficheros resultantes de una búsqueda de cierto tipo de ficheros, con los subdirectorios incluidos:

find -name '*.po' -exec rm -i {} \;

– Para borrar todos los ficheros que tengan más de 50 días:

find /compartido/backups/pro/auto/bd/* -mtime +50 -exec rm {} \;

Como fácilmente podemos acabar borrando lo que no deseábamos, con la opción -i el programa rm pedirá confirmación por cada fichero.

– Para moverlos a otro directorio:

find -name '*.po' -exec mv {} ./poBackups \;

– También podemos renombrar masivamente ficheros, el siguiente comando busca recursivamente todos los ficheros “.po” y los renombra a “.po.bak”:

find -name '*.po' | sed 's/\(.*\).po$/mv "&" "\1.po.bak"/' | sh

Si en vez de “find -name ‘*.po”‘ usáramos “ls -d *.po” serían sólo los directorios del directorio actual.

Busca en el directorio acutal y en los subdirectorios todos los ficheros con la extensión php que contengan la cadena “Possible reason: your host may have disabled the mail“:

find -name '*.php' -exec grep 'Possible reason: your host may have disabled the mail' {} \;

Cuando el listado de resultados es demasiado grande como para manejarlo cómodamente en el terminal, podemos redireccionar el resultado con una pipe desde el standard output a un fichero:

find -name '*.php' -exec grep 'Possible reason: your host may have disabled the mail' {} \; > results.txt

Si de cada fichero encontrado queremos saber su ruta exacta, debemos añadir “-print” al final:

find -name '*.php' -exec grep 'Possible reason: your host may have disabled the mail' {} \; -print

La orden find también nos permite buscar por fechas:

– Encontrar ficheros modificados en el último día:

find -ctime -1 -type f

– Si en vez de “f” usamos “d“, le indicamos que trabaje sólo con directorios:

find -ctime -1 -type d

– Encontrar ficheros más recientes que main.css:

find -newer main.css

Contar el número de ficheros de un directorio y subdirectorios:

find . -type f | wc -l

ls y mv al rescate

A veces, las herramientas más básicas son las adecuadas. Esto es especialmente cierto en UNIX, pues en su tradición está la filosofía de disponer de muchas pequeñas herramientas para tareas muy concretas, permitiendo al usuario combinarlas para conseguir objetivos más complejos.

–  Para contar los elementos del directorio actual podemos usar la orden wc (Word Count), en combinación con ls. El parámetro -l indica que cuente líneas en vez de palabras, por lo tanto, contará el número de líneas que devuelve ls:

ls -1 | wc -l

– Listar sólo los directorios, sin los ficheros, del directorio actual:

ls -d */

– Listar sólo los directorios de un subdirectorio:

ls -d Proyectos/*/

– Mover sólo los ficheros ocultos de un directorio (origen) a otro (dest):

mv origen/{*,.*} dest/

La ralentización que provocan Meltdown y Spectre

Recientemente han aparecido dos vulnerabilidades de seguridad, estas afectan al hardware, no al software, y son muy graves, pues incluso su solución dejará secuelas. Meltdown afecta a todas las CPU de Intel y a algunos modelos de ARM, mientras que Spectre afecta a todos, también a los chips de AMD. Por lo tanto, prácticamente cualquier dispositivo equipado con un microprocesador moderno resulta afectado, desde móviles hasta servidores.

Meltdown

Ya le han hecho logotipo.

Las CPU modernas – o no tanto, pues ya hace unos años de esto – usan técnicas que aprovechan el paralelismo para acelerar la velocidad de procesamiento, una de ellas es la ejecución especulativa. El siguiente pseudocódigo permitirá un sencillo ejemplo de su funcionamiento:

si func1() = func2() entonces
   imprime func3()
fin si

En una arquitectura clásica, primero se ejecutaría la función 1, luego la 2 (o viceversa, depende del lenguaje) para, finalmente, si ambas dan el mismo resultado (este es el “peor” de los casos), ejecutarse la tercera. Su tiempo total equivaldría al de las tres funciones; pero gracias a la ejecución especulativa, la función 3 se calcula mientras se calculan la 1 y la 2, que también pueden paralelizarse, con lo que el tiempo total se reduce al de la función más lenta. Nótese que, si por ejemplo existiera alguna variable global que la función 3 consulta y que puede ser modificada por la 1 o la 2, esta paralelización no podría hacerse, con esta dificultad podemos imaginarnos lo compleja que resulta esta tecnología.

Esta es posible gracias a la duplicidad de las puertas lógicas en las CPU modernas y a la zona de memoria caché que, siguiendo el ejemplo, permite almacenar el resultado de la función 3 en espera de las dos anteriores. En lo que se refiere a la gestión de la memoria RAM, por razones de seguridad, tanto a nivel del microprocesador como a nivel del sistema operativo, existen medidas para evitar que un proceso pueda leer posiciones de memoria pertenecientes a otro. Gracias a ellas, cada proceso puede acceder sólo a la memoria que le ha asignado el kernel; en caso de necesitar más, le concederá más páginas, mientras que por otro lado libera las que dejen de usar otros procesos.

Pues bien, la vulnerabilidad está en el control de acceso a la memoria caché: la información ahí alojada temporalmente por la ejecución especulativa de un proceso, sería accesible por otro, mediante un hipotético exploit. Es decir, procesos que se ejecutan en ring-3 podrían acceder a información sólo disponible en ring-0, algo que debe ser posible sólo para el kernel del sistema operativo.

Spectre

Spectre también. ¡Que cuco!

Hasta donde yo sé1, todavía no ha sido publicado ningún exploit que aproveche completamente las posibilidades que otorga este fallo, pero al ser estas enormes, se está trabajando (me imagino que a destajo) desde hace días en su solución. Como el error es a nivel físico, en el hardware, y ni Intel ni ningún otro fabricante de micropocesadores va a reponer los chips afectados2, se arreglará a nivel de software, parcheando los sistemas operativos, todos, se implementarán en el kernel controles de seguridad más estrictos, y estos van a ralentizar el funcionamiento de los programas.

Putin Melting down

¿Todavía no tenemos ningún exploit, verdad?

Esta es precisamente la secuela comentada al principio del artículo; según una estimación inicial, una vez instaladas las actualizaciones, los procesos serán entre un 5% y un 30% más lentos. Aparentemente, cuantas más llamadas haga el proceso al sistema operativo (cualquier acceso a disco, red, etc.) más se verá afectado. Mientras que, por ejemplo, un proceso que hace uso intensivo de la CPU para cálculos apenas se verá afectado, programas como los sistemas gestores de bases de datos (MySQL, Oracle, SQLServer, etc.) o los servidores web lo notarán bastante más. Sin embargo, cabe esperar que progresivamente se vaya optimizando la solución, pero está por ver hasta que punto.

Probablemente, a quien más afecta este fallo de seguridad es a los centros de datos, pues para un atacante es más jugoso poder acceder a la información de miles (o de millones) de usuarios, que colgar en una web un código Javascript malicioso que pueda acceder a los datos de los procesos en ejecución de nuestro ordenador personal o de nuestro móvil. Paradójicamante, también es a ellos a quienes más va a perjudicar la solución al ser los mayores consumidores de tiempo de CPU. A medida que vayan actualizándose las máquinas, es factible que notemos como se ralentizan las webs y diferentes servicios en la nube.

Por supuesto, los fabricantes de microprocesadores también se verán afectados, especialmente Intel, cuyas CPU son vulnerables a ambos fallos. Si finalmente deben modificar el funcionamiento de la ejecución especulativa, todas las existencias almacenadas ya no sirven, las líneas de producción también deberán ser modificadas, etc. En definitiva, pérdidas millonarias en todo el sector. Está por ver en qué queda todo.


1 Si bien yo no me actualizo diariamente sobre seguridad informática, lo que sé acerca de este tema principalmente me interesa desde el punto de vista del desarrollo de software.
2 A diferencia de la industria automovilística, que sí responde.

Editado el 10/1/2018:

Anoche, en una actualización que aparentaba ser cotidiana del Ubuntu 16.04 que tengo en mi ordenador de sobremesa, se instaló el kernel 4.4.0-108; al reiniciar el sistema, el fallo fue estrepitoso y tuve que purgar esta versión para regresar a la 4.4.0-104. El objetivo de esta actualización del kernel era solucionar la vulnerabilidad Meltdown; cuyas consecuencias, por cierto, siguen sorprendiendo, pues rara vez fallan estas actualizaciones.


Editado el 12/1/2018:

  • Ya existe una prueba de concepto para Meltodown, se encuentra en este repositorio de Github.
  • En cuanto a la actualización del kernel de Ubuntu, parece ser que la versión 109 funciona correctamente y soluciona la vulnerabilidad.

Cómo alargar la duración de la batería en un portátil con Linux

Batería bajaDesde sus inicios y hasta hoy los portátiles, como todos los ordenadores, han ido incorporando un hardware cada vez más potente que conlleva un aumento del consumo energético. A pesar de que se sigue logrando que un elemento de hardware en su versión para portátiles tenga un menor consumo que su equivalente para ordenadores de sobremesa y de los avances en la capacidad de las baterías, no se ha logrado aumentar la duración de la batería, más bien ha sido al contrario.

El software, concretamente el sistema operativo, también está involucrado y es clave en el aumento de la duración de la batería. Así como Windows entra en modo de ahorro de energía cuando el equipo se alimenta de la batería, podemos lograr lo mismo con Linux. Para ello existe el paquete Tlp, disponible para las distribuciones Ubuntu, Mint, Arch, Fedora, Debian y Gentoo. Veamos como se instala en Ubuntu o cualquier otra distribución que use el sistema APT:

sudo apt-get install tlp tlp-rdw
sudo tlp start

Con tan sólo estas dos líneas en la shell ya está instalado y se iniciará cada vez que arranque el equipo. Para asegurarnos de que está correctamente instalado podemos usar la siguiente orden:

tlp-stat -s

Si todo ha ido bien debe devolver algo parecido a esto:

--- TLP 0.8 --------------------------------------------
+++ System Info
System = Notebook Not Applicable W51PU
BIOS = 5.12
Release = Ubuntu 16.04.3 LTS
Kernel = 4.10.0-37-generic #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:59 UTC 2017 x86_64
/proc/cmdline = BOOT_IMAGE=/boot/vmlinuz-4.10.0-37-generic.efi.signed root=UUID=20661533-13a9-49ec-8c9e-e4e601699661 ro quiet splash vt.handoff=7
Init system = systemd

+++ System Status
TLP power save = enabled
power source = AC

Además Tlp es una manera muy sencilla de tener el equipo configurado para una bajo consumo de energía sin necesidad de entender los aspectos técnicos. Tan es así que no es necesario pelearnos con sus opciones de configuración pues la configuración que lleva por defecto es suficiente: podemos instalarlo y olvidarnos.

Ya para finalizar, doy un pequeño tirón de orejas a Pcubuntu.es, quienes me vendieron este equipo sin ninguna herramienta para economizar la batería. Después de instalarla la duración de la batería ha pasado a ser el doble. Además de crítica a la empresa, sirva esto también como ejemplo para el lector del ahorro que supone tenerla instalada. Sin duda debería venir incorporada pues es a lo que otros sistemas operativos nos han acostumbrado a todos los usuarios, ténganlo en cuenta señores de Pcubuntu.es

Vant MiniMoove 11,6″ Pentium N4200

Hacía un par de meses que tenía la idea de comprar algún dispositivo para aprovechar las largas horas que paso en el transporte público, 34 horas mensuales según Google Maps Timeline. Obviamente está la opción del móvil que, como todo el mundo, llevo tiempo usando, pero quería algo donde poder leer más cómodamente, así que dudaba entre una tableta y un portátil. Finalmente me decanté por el portátil pues con él, además de leer, también puedo adelantar trabajo: desde responder un email a programar pues puedo instarle un IDE, un servidor web, etc. La conexión a Internet no es problema pues la proporciona el móvil mediante Bluetooth.

Recientemente ha sido mi cumpleaños, ocasión para que la familia aportara capital como regalo para comprar el ordenador que había ojeado por Internet: el Vant MiniMoove 11,6″, Pentium N4200. Como podéis ver por el tamaño de la pantalla, se trata de un portátil realmente pequeño, por lo que cumple los dos requerimientos más importantes para el uso que le voy a dar: fácil de transportar y larga duración de la batería.

 

Vant MiniMoove 11,6″ Pentium N4200

Su pantalla de 11,6 pulgadas en todo su esplendor.

La parte final de su nombre hace referencia a la CPU. Se trata de la siguiente generación de las series Atom de Intel. Está compuesta por cuatro núcleos y un reloj entre 1.1 y 2.5 GHz. En este modelo es de 1.1 GHz, probablemente porque la refrigeración de la CPU no es muy óptima y con una mayor velocidad hay riesgo de que se sobrecaliente. También incorpora una GPU aunque es bastante irrelevante para el uso que le voy a dar.

Como en mi experiencia para el rendimiento es más determinante la memoria que la CPU, lo compré con 8 GB en vez de los 2 GB del modelo básico. Hay que tener en cuenta que dispone de un único slot para la memoria, por lo que no existe la opción de añadirle otro DIMM del mismo tamaño más adelante para duplicar la memoria, si lo hubiera comprado con menos y quisiera ampliarla más adelante debería desechar el DIMM viejo y reemplazarlo por otro de mayor capacidad.

Otro factor importante para el rendimiento del equipo, por detrás de la memoria, es la velocidad del disco duro. Escogí un disco duro sólido, por ser estos mucho más rápidos que los mecánicos. En cuanto a la capacidad de almacenamiento, es de tan solo 128 GB frente a los mecánicos de 1 o 2 TB y aunque se puede optar por un disco sólido con el doble o triple de capacidad, los 128GB de este cubren sobradamente mis necesidades de almacenamiento y no me compensa el incremento del precio de los discos de mayor capacidad.

Sobre los discos duros sugiero al lector no comprar ningún pequeño portátil Windows con disco duro mecánico pues, a día de hoy, todos se venden con Windows 10, la versión 8 desapareció del mercado, y el uso del disco duro que hace el último sistema operativo de Microsoft es tan intensivo que sólo un disco sólido puede proporcionar al usuario una experiencia óptima. En definitiva, sólo un portátil de altas prestaciones puede proporcionar al usuario una experiencia óptima en Windows 10.

Para este portátil me decanté por un Linux como sistema operativo. Además de ser el de mi preferencia tanto para ordenadores de sobremesa como para portátiles por las ventajas que he expuesto en este blog, en el caso de un Notebook se añade la ventaja de consumir menos recursos, la cual destaca cuando los recursos son algo más limitados.

GNU/ Linux Inside Vant MiniMoove 11,6″ Pentium N4200

Tux inside.

El precio total, IVA incluido, con el canon digital de la ADEPI, es de 383€ sin los gatos de envío. Creo que he comprado un notebook reducido en el precio pero no en las prestaciones pues un equipo de rendimiento similar pero con Windows estaría por encima de los 500€.

Teclado Vant MiniMoove 11,6″ Pentium N4200

Teclado de membrana. Mejor tratarlo con suavidad si quiero que dure años.

Lateral izquierdo Vant MiniMoove 11,6″ Pentium N4200

De izquierda a derecha: conectores VGA, HDMI, USB 3.0 y las clavijas del micrófono y del audio.

Lateral derecho Vant MiniMoove 11,6″ Pentium N4200

De izquierda a derecha: 2 puertos USB 2.0, lector de tarjetas, conector de red RJ-45 y alimentación.

Si os interesa comprar un ordenador con Linux y por lo tanto no queréis pagar una licencia de un software que tampoco vais a usar, echadle un vistazo a Vant, una marca de ordenadores que vienen con la distribución Ubuntu de Linux instalada. Este modelo lo compré a través de Pcubuntu. De momento todo ha ido bien, las únicas dos pequeñas quejas que tengo están relacionadas con la configuración del sistema operativo:

Sobre este último punto, cómo aumentar la duración de la batería en los portátiles con Linux, escribiré en un próximo artículo.

Modificar imágenes desde la línea de comandos con ImageMagick

ImageMagick es un completísimo paquete de programas multiplataforma para el tratamiento de imágenes. A diferencia de programas como Photoshop o Gimp, los programas que lo componen se ejecutan desde la línea de comandos, aunque también dispone de un sencillo entorno para X Window en Linux.

Entorno gráfico de ImageMagick en Linux

Tiene numerosas herramientas que, entre otras cosas, permiten:

  • Convertir entre una gran cantidad de formatos de imágenes.
  • Manipular la paleta de colores de una imagen.
  • Añadir tramados.
  • Crear un gif animado a partir de varias imágenes.
  • Superponer una imagen encima de otra.
  • Añadir texto a una imagen.

En la documentación se puede ver un listado detallado.

En la web es frecuente que el gestor de contenidos cree automáticamente réplicas de diferentes tamaños a partir de una imagen subida por el usuario para su correcta visualización en diferentes páginas. Por lo tanto, sin duda lo más usado para la web es su capacidad de reescalar imágenes, para lo que usa el algoritmo de “liquid rescaling“. Ademas la modificación de tamaño es muy flexible, permitiéndonos lograr la modificación que estemos buscando.

Tal vez algún lector se esté preguntando que habiendo programas con entorno gráfico como los citados más arriba, para qué trabajar en el modo texto de la shell de Linux/Unix. Veamos entonces un caso en que sería conveniente. Resulta fácil que una web acabe teniendo miles de imágenes distribuidas en cientos o miles de directorios, pues, por cada imagen que el administrador del contenido sube se van a crear varias copias con diferentes tamaños. Fácilmente el total de imágenes de un catálogo de productos, por ejemplo, se vuelve inmenso. Imaginemos que un cambio de diseño o la necesidad de hacer la web responsive hace necesario modificar el tamaño de una de las copias que se estaba guardando de cada imagen. En vez de modificarlas una a una con nuestro programa de edición de imágenes favorito, se puede crear un shell script como este:

ls *jpg | while read i
do
f=`basename $i .jpg`
convert $i -resize 200x200 smaller-$f.jpg
done

Lo que hace es buscar todas las imágenes jpg del directorio y gracias al comando convert de ImageMagick crea una copia más pequeña reescalada a 200×200 píxeles cuyo nombre será la cadena “smaller-” concatenada al nombre del fichero original. Fácilmente se podría modificar el script para que recorriera recursivamente todos los subdirectorios.

Todo lo que nos ofrece ImageMagick se puede utilizar desde diferentes lenguajes de programación y no solo porque desde éstos se pueda invocar comandos en la shell* y por lo tanto a ImageMagick, si no que el paquete ha sido portado. Está disponible en Java, .NET, Ruby, Pearl, Python, Php, etc. Aquí hay una lista detallada de todos.

En el caso concreto de PHP existe la extensión nativa IMagick. Sin duda es GD la extensión más extendida, valga la redundancia, en PHP. A pesar de su mayor propagación, y como es tan frecuente en el mundo de la informática, IMagick presenta algunas ventajas sobre GD que la convierten en una mejor extensión para trabajar con imágenes. Aquí un artículo con una comparación entre ambas.


* Como hace Drupal, el extendido CMS en PHP.


Aunque la palabra comando es un calco de inglés y en español es más correcto usar orden o instrucción, uso el término que usamos habitualmente en nuestro trabajo.


 

Lesbian in the shell

Desde que instalé Debian por primera vez, hará ya unos 14 años, tengo la costumbre de llamar “Lesbian” a cualquier ordenador de mi propiedad que lleve Linux. Por cierto, casi siempre he usado la distribución Debian o una variante.

Lesbian in the shell

Shell in the Lesbian

Ghost in the shell

Ghost in the shell. De moda otra vez después de más de 20 años. Ahora Motoko Kusanagi sufre un whitening.