By Justindorfman - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=53428398

Comandos para GNU/Linux pocos conocidos

Hoy tuvimos el regocijo de leer un artículo publicado por los colegas de LinuxAdictos donde hablan sobre comandos pocos conocidos para la terminal GNU/Linux. Es por ello que decidimos publicar nuestra propia entrada pero dandole valor agregado: vamos a enfocarlo desde nuestra distribución preferida, Ubuntu Desktop (actualmente usamos las 16.04 LTS) y también como suplemento a nuestra otra entrada sobre la introducción a la cónsola de comandos; ¡venid y acompañadnos en la búsqueda del conocimiento!

By Justindorfman - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=53428398
By Justindorfman – Own work, CC BY-SA 4.0

Comandos que vienen incluídos en Ubuntu.

Pues eso, comandos poco conocidos que ya vienen por defecto ya instalados en Ubuntu, nada más teclearlos los podemos utilizar. Lo que haremos acá es teclear el comando “man” seguido de un espacio y el nombre del comando a conocer, leeremos su descripción en inglés y las traduciremos y le buscaremos propósitos prácticos, comencemos pues.

Comando “calendar”:

El comando “calendar” pertenece al paquete de bsdmainutils que viene por defecto en la distro GNU/Linux que utilizamos para esta entrada, Ubuntu 16.04 Xenial. Dado el caso extraño que no lo tengáis instalado podéis hacerlo con el comando “sudo apt-get install bsdmainutils” y sin ir a mucha profundidad en la materia, podréis ver los archivos que componen ese paquete de software en este enlace.

Este paquete proviene del muy antiguo sistema Unix (el comando “man calendar” especifica que un comando calendar apareció en la “Version 7 AT&T UNIX” en 1979) y ciertamente que nos fue difícil encontrar a quien o quienes actualmente mantienen dicho repositorio, ya que el mero hecho de ser un calendario implica lo más dinámico de este mundo: el transcurrir del tiempo es siempre cambiante. En un “fork” al que tuvimos acceso hecho por Andrey Ulanov < drey @ rt.mipt.ru > en el año 2002 comenta que proviene de OpenBSD e incluye una licencia que se hereda de cada uno de sus componentes, por ejemplo el módulo pathnames.h nos da la siguiente información:

/* $OpenBSD: pathnames.h,v 1.3 1996/12/05 06:04:41 millert Exp $ */
/* $Id: pathnames.h,v 1.1.1.1 2002/11/26 23:37:38 drey Exp $ */

/*
 * Copyright (c) 1989, 1993
 * The Regents of the University of California. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 * must display the following acknowledgement:
 * This product includes software developed by the University of
 * California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * @(#)pathnames.h 8.1 (Berkeley) 6/6/93
 */

Como véis se remota hasta el año de 1989, época en la cual apenas nosotros entrábamos a estudiar en la universidad, ¡fascinante como pasa el tiempo! Otra cosa es la fuente de bsdmainutils en la distribución Debian donde el propio Ian Murdock introdujo código fuente según se puede leer en esta página (no obstante acá la reproducimos de igual manera):

This is a collection of programs from 4.4BSD-Lite that have not (yet)
been re-written by FSF as GNU.  It was constructed for inclusion in
Debian Linux.  As programs found here become available from GNU sources,
they will be replaced.

This package was originally put together by Austin Donnelly
<and1000@debian.org>, but is heavily based on bsdutils, originally put
together by Ian Murdock <imurdock@gnu.ai.mit.edu>.  Please report any
problems or suggested additions or changes to Austin Donnelly.

Then the package has been maintained by Charles Briscoe-Smith
<cpbs@debian.org>.  I gathered data for the 1999-2001 calendar files
from various sources on the Internet, and I'd also like to thank Oliver
Elphick, Julian Gilbey, Daniel Martin and Jaldhar H. Vyas for providing
much useful data on the various religous calendars.  I have edited the
files they provided to fit calendar's requirements, so any errors should
be attributed to me.

After cpbs@debian.org, Marco d'Itri <md@linux.it> maintained it for
almost two years, before Tollef Fog Heen <tfheen@debian.org> took over.
The package is now maintained by Graham Wilson <bob@decoy.wox.org>.

This package may be redistributed under the terms of the UCB BSD
license:

Copyright (C) 1980 -1998 The Regents of the University of California.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
4. Neither the name of the University nor the names of its contributors
   may be used to endorse or promote products derived from this software
   without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.

Usando el comando “calendar”.

Nada más en la terminal al introducir el comando sin ningún parámetro veremos algo similar esto, os indicamos que la salida por pantall dependerá de la fecha de vuestro ordenador y os dará resultados similares o diferentes:

Figura 1:
bsdmainutils calendar 22 y 23 de abril
bsdmainutils calendar 22 y 23 de abril

Notad la última línea en castellano, ya os explicaremos luego. Como bien podéis observar la cosa va en idioma inglés lo cual no representa problema, tal cual el latín en el mundo antiguo fue la lengua franca así lo es hoy este idioma. Lo que os advertimos es que hay varios idiomas más, tales como el francés y el ruso [justo arriba del Día de San Jorge esta en ruso el “Красная горка (праздник)” -aparición de Jesucristo a sus discípulos y la conversión del Apóstol Tomás-] y aunque no tiene calendarios del planeta entero, la intención del programa es bueno y tiene dos utilidades extras que estudiaremos pronto.

¿De dónde saca este programa calendar los datos a mostrar por pantalla? En la carpeta /usr/share/calendar/ de nuestros ordenadores se almacenan una serie de ficheros con el nombre, cómo no, calendar pero con diferentes extensiones cada uno, por ejemplo .russian, .christian o .computer.

Figura 2
ls usr share calendar
ls usr/share/calendar

Como bien imaginamos por los metadatos, cada extensión describe lo que contiene el archivo y cuando llamamos al programa calendar simplemente lee y extrae los datos correspondientes a la fecha actual de cada fichero, pero hay más: también hay unos directorios con nombres claves que describen las dos primera letras el idioma separados de un guión bajo y dos letras más en mayúsculas que describen el país. Así tenemos que el directorio de_AT contiene en idioma alemán (“deuschtland” en inglés) del país Austria (AT) donde se habla el alto alemán, más inclinado hacia el latín; de segundo en el listado está de_DE que corresponde al idioma Alemán de Alemania (ea, eso sonó feo en nuestro bello idioma castellano, nuestro idioma no es amistoso con esto de las redundancias).

Como somos unos “hackers” -o estamos en camino de ‘graduarnos’- podemos hacer uso del comando grep y la ‘tubería’ “|” para filtrar resultados por una palabra clave específica, por ejemplo “Bonne fête” o “Feliz cumpleaños” en francés, para ello teclearemos lo siguiente: calendar | grep “Bonne fête” y solo tendremos dos líneas –o ninguna o varias, repetimos que eso depende de la fecha de nuestro ordenador-.

Esto es para búsquedas puntuales y exactas (claro que con el uso de expresiones regulares podremos ampliar la búsqueda -mayúsculas/minúsculas, caracteres comodín, etc), pero ¿qué tal si queremos ver temas específicos? Veamos alguno de estos ficheros de datos con fechas y busquemos uno que está en nuestro idioma, por ejemplo “calendar.argentina”. Si le damos el comando cat en la ubicación /usr/share/calendar al fichero calendar.argentina:

Figura 3
cat usr share calendar calendar argentina
cat usr/share/calendar/calendar.argentina

Evidentemente escrito en lenguaje C notamos un encabezado describiendo el autor, unas variables de enlace para ser compiladas, el conjunto de caracteres a emplear y el conjunto de datos, uno por cada línea. Comienza con el mes abreviado en tres letras del idioma inglés, espacio, dos dígitos -cero a la izquierda de ser necesario-, caracter tabulador y luego la descripción del evento del correspondiente día.

Sumamente importante a destacar es que debemos separar la fecha de la descripción por medio del caracter tabulador( Tab↹ ), de lo contrario la línea no será mostrada en el calendario (nuevo en esta versión y que se diferencia de versiones anteriore según “man calendar“).

Hasta acá lo único especial son los comandos en lenguaje C ya que los eventos están muy bien “formateados” en texto plano pero son precisamente esas referencias en C las que nos indican que hay algo más. Esto quiere decir que “calendar” tiene una estructura rígida y que deben tener esos encabezados pero la cosa no termina allí. Si detalláis en la “Figura 2” nosotros agregamos un fichero calendar.venezuela con encabezado en toda regla y unos pocos acontecimientos históricos de nuestro país pero nada de nada, no lo muestra para nada. Eso quiere decir que solamente se atiene a los archivos que vengan con el paquete para probar esto último modificamos el fichero calendar.unitedkingdom:

sudo nano /usr/share/calendar/calendar.unitedkingdom

Y modificamos la línea del 23 de abril, Día de San Jorge, le colocamos la descripción en castellano y la muestra por pantalla sin problema alguno (figura 1). Lo bueno del software libre es que tenemos acceso directo al código fuente y podemos modificar y compilar, ya sea de manera estática o dinámica, a gusto con nuestras modificaciónes. Pero antes de hacer esto sigamos estudiando las opciones ya establecidas en el comando “calendar” y luego veremos que más podemos hacer.

Parámetros del comando “calendar”:

Primero podemos consultar los eventos de cualquier otra fecha simplemente acompañando de un espacio, el comando del parámetro “-t“, otro espacio, y la fecha en formato AAAAMMDD, por ejemplo el 30 de diciembre de 2017 lo solicitamos de la siguiente manera:

calendar -t 20171230

Desglosamos la respuesta y no vemos por ningún lado la nota con el fallecimiento del gran Ian Murdock, padre de la distribución Debian (madre a su vez de Ubuntu) y que tiene su propio fichero calendar.debian. Por si acaso es que estamos cegatones volvemos a aplicar el comando grep de la siguiente manera:

calendar -t 20171230 | grep "urdock"

El cual no devuelve nada, aunque si usamos

calendar -t 20171230 | grep "KPD"

Sí que obtenemos respuesta: “Gründung der KPD, 1918”, “Kommunistische Partei Deutschlands” o establecimiento del Partido Comunista Alemán, el 30 de diciembre de 1918. Es por ello que tecleamos el comando

 sudo nano /usr/share/calendar/calendar.debian

y agregamos la siguiente línea (recordad de insertar pulsar la tecla Tabulador entre la fecha y la descripción):

Dec 30↹Ian Murdock, stalwart proponent of Free Open Source Software, Father, Son, and the 'ian' in Debian.

Guardamos y listo, guardamos el recordatorio de tan lamentable fallecimiento para futuras generaciones 😔😢.

Por defecto el comando calendar muestra dos días de acontecimientos (el nombre correcto son recordatorios) pero podemos especificar el número de días con el parámetro -l acompañado del número de días hacia adelante que queremos visualizar (nota: el otro parámetro que hace exactamente el mismo trabajo es -A pero como se presta a confusión con el otro parámetro –a usaremos siempre -l). Así si queremos ver exactamente los recordatorios del 30 de diciembre debemos teclear lo siguiente:

calendar -l 0 -t 20151230
Figura 4
calendar -l 0 -t 20151230
calendar -l 0 -t 20151230

Con el parámetro -B podemos especificar hacia atrás en el tiempo, desde la fecha señalada por el parámetro -t, el número de días que queramos ver. Por cierto que si se obvia el parámetro -t se toma la fecha del ordenador y si es viernes mostrará hasta el próximo lunes siguiente (si hay recordatorios); el parámetro -w se basa en eso para especificar el número de días hacia el futuro, pero no hayamos especialmente útil esa opción.

¿Recuerdan que comentamos haber realizado un calendario para Venezuela? Pues bueno llegó la hora de poder visualizarlo con el parámetro -f acompañado de la ruta de ubicación del archivo de marras, para ello metemos:

calendar -t 20170101 -l 364 -f /usr/share/calendar/calendar.venezuela
Figura 5
calendar -t 20170101 -l 364 -f calendar.venezuela
calendar -t 20170101 -l 364 -f calendar.venezuela

¿Qué tal nos ha quedado? Para subir este archivo y contribuir con el software libre publicaremos dicho archivo en GitHub con licencia “Creative Commons” e instrucciones sobre como instalarlo y utilizarlo.

Instalando “calendar.venezuela” en nuestro ordenador.

Según las instrucciones en el archivo calendar.all deberíamos copiar dicho archivo a nuestra carpeta personal “~/.calendar/” si queremos editar dicho archivo. Esto es así ya que si compartimos un ordenador con varias personas lo lógico es que cada quien tenga su calendario particular, es decir, en el fichero “calendar.all” podemos especificar cuales ficheros queremos ver y/o utilizar. Si lo copiamos a nuestro perfil personal podemos editarlo sin molestar a los otros usuarios del sistema.

En nuestro caso decidimos modificar el archivo calendar.all para todos los usuarios para que tengan acceso al fichero de recordatorio de Venezuela (ambos en la carpeta /usr/share/calendar/). Para ello agregamos al archivo la siguiente línea, justo al final, por orden alfabético:

#include <calendar.venezuela>

Luego guardamos y podemos inmediatamente comprobar si funciona. De igual manera así como agregamos, podemos “quitar” ficheros de recordatorios que no pensamos usar. En realidad quitamos es la referencia o referencias, no el o los archivos en sí mismos.

Comandos “cal” y “ncal”:

Si necesitamos ver por pantalla el mes actual simplemente tecleamos cal y lo veremos por pantalla y el día actual estará resaltado. De manera similar funciona ncal pero en vez de tener los días de la semana en el eje de las abscisas los coloca en el eje de las ordenadas. Los parámetros son comunes a ambos comandos, pero tienen sus excepciones (os queda como tarea averiguar cuáles):

  • Si no queremos ver resaltado el día actual usaremos el parámetro -h.
  • Si queremos ver un mes específico del año actual usaremos -m n donde n es el número del mes. También podemos colocar las tres primeras letras del mes (inglés o castellano, sin embargo no reconoce francés ni ruso).
  • Si queremos ver el año completo -en curso- colocamos -y. Si necesitamos un año específico lo colocamos al lado (calendario gregoriano). Por ejemplo podremos saber que el 26 de diciembre del año 7017 será un día viernes. 🤓
  • Podremos combinar mes y año en la misma orden, ejemplo: cal -m 12 2117 mostrará el mes de diciembre del año 2117.
  • Algo muy útil es visualizar el mes anterior, el actual y el venidero: para ellos usamos el parámetro -3.
  • Para ver varios meses hacia adelante, -A seguido del número de meses; -B especifica los meses hacia atrás. Ejemplo: “cal -B 1 -A 3″.
  • Como sabemos el día cero en informática es el domingo, día del Señor, quien al séptimo día tomó descanso (sábado para los judíos). Para nosotros los católicos el domingo es día de adorar a Dios así que comenzamos a trabajar los lunes, por ello podemos especificar que las semanas comienzen los días lunes con -M y con -S comienzan los domingos (opción por defecto). Esta opción no funciona con cal no obstante ncal tiene un parámetro -b que tiene el mismo estilo de cal, ¡probad!

Comando “yes”:

Brevemente diremos que es un comando para nosotros los “nerds”: el comando yes repite indefinidamente por pantalla el texto que lo acompañe. Para detenerlo debemos usar la combinación de teclas CTRL+C (esto es válido para todos los comandos de terminal). Viene con el conjunto de utilerías básicas GNU.

Comando “col”:

El comando col también es poco conocido pero tiene el aliciente de trabajar con los comandos nroff, tblcolcrt; sin embargo le hallamos cierta utilidad didáctica si lo combinamos con los caracteres especiales utilizados para el shell y el lenguaje C. Es por ello que comenzaremos de atrás para adelante: presentamos los caracteres especiales y terminamos con el comando col.

Pues bien, en el juego de caracteres ASCII (ahora sustituidos por los caracteres UNICODE y representados de manera práctica con UTF-8 –revisad nuestro tutorial sonbre HTML5- ) los primeros 31 caracteres son especiales, llamados “de sistema” y tienen diversos usos especiales. Como abreboca tenemos el ACK (acknowledgement) o reconocimiento: si recibimos un datagrama por TCP (o un paquete por puerto serial) y el contenido es recibido de conformidad a reglas preexistentes simplemente contestamos enviando dicho caracter, el número 6 en sistema de numeración decimal (en sistema binario es 000 0110 e igual es 6 en octal y hexadecimal). Además de esta numeración en el lenguaje C (así como Java, Perl e incluso Visual Basic) se le representa con caracteres de escape (esto se presta a confusión a la hora de traducir al castellano, ojito como lo interpretáis). Estos caracteres de escape tienen la función de salir, escaparse de la representación tal como son y se interpretan por pantalla e impresoras de matriz de punto (y algunas de inyección de tinta) de manera diferente. ¿Qué diantres tiene esto que ver con la terminal GNU/Linux o “shell”? 🤔

Vamos a la práctica directamente con solamente un caracter: el número 11 que corresponde al tabulador vertical (no confundir con el tabulador horizontal) al cual podemos almacenar en una variable con ayuda del operador $ el cual interpreta los códigos “escapados” por medio de “\0” -si es octal- o “\x” si es hexadecimal. En este caso sería “\013” en octal o “\xob” en hexadecimal. Corred los siguientes ejemplos en vuestra terminal:

tab_ver=$'\013'
echo "$tab_ver"
tab_ver=$'\x0B'
echo "$tab_ver"

Como notaréis aparentemente no vemos nada por pantalla y para notar como trabaja el tabulador vertical podemos acompañarlo de texto descriptivo de la siguiente manera, mirad la animación:

comando col
comando col

Allí veís el famoso comando col en acción. Otra forma de representar al tabulador vertical en lenguaje C es con “\v“:

jimmy@KEVIN:~$ linea=$'\vLinea 1.\vLinea 2.\vLinea 3.'
jimmy@KEVIN:~$ echo "$linea"

Linea 1.
    Linea 2.
        Linea 3.
jimmy@KEVIN:~$

Comando “colrm”:

El comando colrm nos permite remover la primera n columnas ya sea de un archivo de texto o lo que ingresemos por cónsola de comandos. Hacemos notar que la numeración comienza en uno y no en cero como la mayoría de las matrices en computación. El ejemplo aclara dudas:

comando colrm n+1 columnas
comando colrm n+1 columnas

Otro uso es suministrarle dos parámetros: la columna de inicio y el largo que removerá:

comando colrm n m columnas
comando colrm n m columnas

Comando “column”:

El comando column viene a ser de utilidad si queremos mostrar en columnas una lista que tengamos ya sea en un archivo o en una entrada de texto de terminal con el conector tubería “|“.

comando column
comando column

Comando “from”:

Este comando permite visualizar lo que hallan enviado los usuarios por el sistema de correo en un ordenador GNU/Linux. Sirve como sistema de comunicación enre los usuarios registrados en un ordenador.

Comando “hexdump”:

Permite desglosar los códigos ASCII  en su representación decimal, octal o hexadecimal e incluso aplicandole un formato específico (aparte de los que trae de manera predeterminada) ya sea de un archivo o por entrada de terminal. Acá vemos el formato más útil para dicho comando, pero las posibilidades son infinitas:

jimmy@KEVIN:~$ echo "ABCD" | hexdump -v -e '/1 "%_ad# "' -e '/1 "%02X hex"' -e '/1 " = %03i dec"' -e '/1 " = %03o oct"' -e '/1 " = _%c\_\n"'
0# 41 hex = 065 dec = 101 oct = _A_
1# 42 hex = 066 dec = 102 oct = _B_
2# 43 hex = 067 dec = 103 oct = _C_
3# 44 hex = 068 dec = 104 oct = _D_
4# 0A hex = 010 dec = 012 oct = _

Esencialmente usamos el comando echo para enviar las cuatro primeras letras del abecedario por medio del comando “tubería” “|” y entregarselo a hexdump el cual lo desglosa caracter a caracter y muestra su código ASCII en diferentes sistemas de numeración para luego insertar un retorno de carro al final de cada línea “\n“.

Comando “look”:

Si por ejemplo necesitamos buscar palabras que tengan un prefijo común, por ejemplo “oft”, introducimos “look oft” lo cual devuelve unas  cuantas palabras… en inglés (often: a menudo, frecuentemente). Si bien indica que depende de la configuración que tengamos en ENVIRON (por ejemplo podemos ver cual lenguaje tenemos configurado si tecleamos echo $LANG) siempre utiliza el idioma inglés por defecto. Para buscar una lista de palabras en idioma castellano deberemos especificar que usaremos el diccionario ubicado en /usr/share/dict/spanish. ¿Utilidad? Tal vez querramos hacer un ataque de fuerza bruta a una contraseña usando palabras comunes, quien sabe.

Comandos “wall” y “write”:

Con wall podremos enviar un mensaje a todos los que estén conectados o conectadas por cónsola, quieran o no recibir el mensaje. Por el contrario, si queremos enviar a un usuario específico usamos el comando write acompañado del nombre de usuario y la erminal donde esté conectado. Para saber quiénes están en línea usaremos who.

Otros comandos poco conocidos:

lorder, ul.

Comandos que se deben instalar desde repositorios oficiales.

Comando “termsave”:

Comando “pv”:

Comando “banner”:

Fuentes consultadas:

En idioma castellano:

En idioma inglés:

En idioma ruso:

Image Magick

ImageMagick (tutorial).

Recientemente tuvimos la estupenda oportunidad de asistir al Congreso de Tecnologías Libres 2016 y tuvimos la necesidad (madre de las invenciones) de publicar las fotografías que capturamos en el evento. En un principio redimensionamos unas pocas para nuestra cuenta Twitter, pero pronto nos dimos cuenta que la tarea es tediosa y debemos aligerar la carga con herramientas del Software Libre. No hace mucho tiempo uno de nuestros faros en GNU/LINUX -en lengua castellana- Ubunlog publicaron un artículo sobre ImageMagick: instalación y usos básicos del mismo. Pero como nos percatamos que el proceso masivo  de 300 imágenes en una sola linea de comando puede “colgar” nuestra computadora por largo tiempo decidimos publicar esta entrada con el valor agregado de nuestros anteriores temas publicados y además unos “scripts” que tal vez les puedan ser útiles a ustedes, amén de la recomendación de un “plugin” para WordPress con el cual escribimos estas líneas a la fecha (quien sabe, tal vez algún día evolucionemos hacia otra plataforma de blogging).

ImageMagick.

ImageMagick
ImageMagick

Breve historia.

Bien lo retrata en su página web la historia de ImageMagick que pasamos a traducir y resumir, contada en idioma inglés por John Cristy (Principal ImageMagick Architect):

Corría el año de 1987 cuando el Dr. David Pensak, supervisor de John Cristy en la empresa de productos químicos llamada Dupont, le solicitó  poder mostrar imágenes de 24 bits (color verdadero) en los nuevos -y costosos- monitores de 256 colores ya que hardware de aquella época tenía muy poca potencia -y por ende debían ser convertidos a 256 colores-. Es por ello que John Cristy utilizó el buscador de moda para ese entonces: Usenet. Obtuvo respuesta de Paul Ravelin donde le indicaba no una, sino varias soluciones de software para la tarea encomendada y puso a su disposición un servidor FTP del “Information Sciences Institute” (ente adscrito a la Universidad del Sur de California) con el código fuente de numerosas aplicaciones. Tras varios años de conseguir muchas de las respuestas, en lo que a computación se refiere, en su trabajo para la empresa Dupont -y el exigente Dr. David Pensak- él se decidió a mejorar y retribuir todo el software utilizado y decidió igualmente liberar las herramientas de procesamiento de imágenes para que otros -¡ejem! nosotros por ejemplo- nos beneficiriamos de ello (de hecho nosotros contribuimos en esta entrada con un “script” en “bash” y otro en lenguaje PHP, así que la historia ¡sigue y sigue!).

Pero como del “dicho al hecho hay enorme trecho” él primero tenía que solicitar permiso a la empresa Dupont en la cual laboraba, ya que en horas de trabajo fue que él desarrolló dichas herramientas. Es así que de nuevo interviene el Dr. David Pensak y convence a sus superiores de otorgar permiso de “copyleft” a John Cristy ya que no era ni un producto químico ni biológico y ellos no tenían noción del valor del software para entonces. Es así que el 1° de agosto de 1990 ImageMagick ve la luz en Usenet en el grupo “comp.archives” (gracias de nuevo Dr. Pensak).

A mediados de los años 1990, y con miles de usuarios en el mundo entero, ImageMagick versión 4.2.9 fue incluido en un nuevo sistema operativo que era distribuido libremente: GNU/Linux.

Es así que luego de su distribución junto a GNU/Linux el sr. Bob Friesenhahn contacta a John Cristy a fin de “normalizar” la aplicación para que sea compatible con el resto de las herramientas de dicho sistema operativo (más adelante veremos que gracias a esto es que hoy en 2016 nosotros podemos desarrollar “scripts” o guiones funcionales y compatibles en otros idiomas de programación).

A partir de la versión 5 de ImageMagick se incorpora de esta manera el lenguaje C++ y se unen al desarrollo los siguientes programadores:

Ya eran decenas de miles de usuarios de ImageMagick cuando sucedió lo impensable: el desarrollo evolucionó tanto que en un momento dado la nueva versión era incompatible con una API existente e hizo que los usuarios reaccionaran bruscamente y exigieron paralizar la programación mientras que los desarrolladores quería seguir adelante. John Cristy no dio su brazo a torcer así que ImageMagick -de la mano de Bob- recibe su primera bifurcación de código y nace Magick++, el primer “fork” (como se conoce en el idioma inglés). Recordemos que precisamente esta es una de las normas de la licencia que rige el software libre, así que John Cristy continuó solo su camino.

Pero no trabajó solo por mucho tiempo: Anthony Thyssen le indicó ciertas fallas en la linea de comandos, los cuales no solo se corrigieron sino que también se mejoraron hasta tal punto que vieron que era necesario emitir una nueva versión: ImageMagick 6.0.

Tan lejos llegaron las librerías de Anthony Thyssen que el mismo John Cristy quedó sorprendido de la capacidad del código fuente original, y que públicamente reconoce la labor hecha en el avance de la colaboración en proyectos de software libre. A continuación, y en honor de quienes contribuyeron (y respetando las normas de la licencia GNU bajo la cual está concebida ImageMagick) nombramos a:

  • Fred Weinhaus (cientos de “scripts” que son libres para uso no comercial, caso contrario contactar a Fred Weinhaus para su autorización).
  • Glenn Randers-Pehrson (gurú del formato PNG).
  • Dirk Lemstra (desarrollo en ambiente “Windows” bajo .NET)

ImageMagick tiene ya una edad de 25 años al momento de escribir este artículo, y rumbo a los siguientes 25 años se desarrolló la versión 7.0 con importantes novedades descritas en este enlace web. Además, ustedes pueden encontrar la licencia que rige a ImageMagick en este otro enlace.

Instalación de ImageMagick en Ubuntu.

La instalación es común a las distros GNU/Linux basados en Debian:

apt-get install imagemagick

Recuerden que deben tener derechos de usuario raíz, para mayores detalles al trabajar la línea de comandos consulten nuestro tutorial al respecto.

Finalmente, para verificar si está correctamente instalado en nuestro ordenador, podemos ejecutar las siguientes lineas de comando con las cuales “crearemos” el logotipo de ImageMagick, visualizaremos sus especificaciones con el comando identify y luego lo abriremos en una ventana gráfica con el comando display:

convert logo: logo.gif
identify logo.gif
display logo.gif

Al ejecutar el comando display tal vez recibiréis un mensaje un tanto singular: el reporte de unas fuentes de texto faltantes. La explicación rápida es que son fuentes privativas, no libres, y no acompañan a las distribuciones GNU/Linux. Más información en este enlace web.

Tal vez, cuando estéis más avezado o avezada con ImageMagick, necesitareís instalar las librearías avanzadas (una de tantas que existen) con el siguiente comando:

apt-get install graphicsmagick-imagemagick-compat

Como vosotros podéis ver, de primero utilizamos el comando convert el cual pasamos a describir en la siguiente sección.

Comando “convert”.

El comando que nos interesa para redimensionar de manera masiva -y a nuestra manera- una gran cantidad de imágenes es el comando “convert“. Específicamente para redimensionar lo acompañamos del argumento “-resize” y de seguido los dos valores de ancho y alto deseados. Sin embargo, debemos conocer un poco más acerca de algunos de los otros argumentos disponibles:

  • Lo más básico: renombrar imágenes de manera masiva seleccionando un patrón de búsqueda y un prefijo que automáticamente numerará el comando. Por ejemplo si introducimos la orden “convert *.jpg fotos.jpg” ImageMagick renombrará todos los archivos jpg en la carpeta donde estemos ubicados en la linea de comandos de la siguiente manera: foto-1.jpg , foto-2.jpg , foto-3.jpg , etc.
  • Ya vimos cómo renombrar masivamente un grupo de imágenes pero para convertir una sola solo debemos, desde luego, indicarle su nombre específico, y si queremos o necesitamos, otro nombre específico de salida para mantener el original; es decir, si omitimos el segundo nombre ImageMagick reemplazará el archivo de imagen original -cuidado con esto-. Las siguientes opciones soportan ambas maneras en este párrafo descritas y renombran masivamente según el párrafo anterior.
  • Para rotar una imagen utilizamos el argumento “-rotate” seguido del ángulo a rotar, por ejemplo “convert imagen.jpg -rotate 90 nueva_imagen_rotada.jpg“.
  • Si queremos convertir a otro formato de archivo simplemente especificamos el o los archivos deseados acompañado del nombre con la extensión deseada. Por ejemplo “convert imagen.jpg imagen.png” o si queremos convertir todas las imágenes jpg en una carpeta: “convert *.jpg imagen.png” (recordad que ImageMagick agregará un sufijo numerado a cada archivo convertido: imagen-1.png , imagen-2.png , imagen-3.png , etc.)
  • También podemos bajarle calidad a una imagen utilizando el argumento “-quality” acompañado del porcentaje deseado -formato jpg-.
  • Si necesitamos redimensionar utilizamos, por ejemplo, “convert imagen.jpg -resize 1024×768” con lo cual obtendremos una imagen de tamaño 1024 píxeles de ancho por 768 píxeles de alto sin conservar el archivo original. Para obtener un archivo nuevo (otro ejemplo) emplearíamos “convert imagen.jpg -resize 1024×768 imagen_redimensionada.jpg“.
  • Por último podemos combinar los diferentes argumentos, teniendo en cuenta el problema con el que nosotros nos tropezamos: el redimensionamiento masivo de imágenes puede hacer que nuestro ordenador quede bloqueado durante un buen tiempo, por eso decidimos utilizar un “script” que procesa uno a uno cada archivo.

Uso de ImageMagick en un “bash script”.

Ya en una entrada anterior hablamos procesar una serie de imágenes y aplicarle Reconocimiento óptico de caracteres con el programa Tesseract y vamos a reutilizar el “script bash” o proceso por lotes allí muy bien explicado, así que si os gusta id, leedlo y volved.

#!/bin/sh
####Licencia de uso###
# Copyright 2016 Jimmy Olano at ks7000.net.ve
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
######################
patron="P*.JPG"
nomarch="lista.txt"
clear
ls $patron > $nomarch
while read linea
do
 echo "Procesando "$linea
 convert $linea -resize 1024x768 $linea
 echo "aplicando logotipo a "$linea
 php funde_logo.php $linea
 rm $linea
done <$nomarch
rm $nomarch
echo "Trabajo terminado, imagenes redimensionadas e insertadas con logotipo."

Como veís publicamos de una buena vez el script y pasamos a describirlo linea por linea para su rápida comprensión:

  • En la línea N° 1 especificamos que es un archivo de procesos por lotes.
  • De la línea 2 a la 16 le establecemos la licencia Apache la cual es adecuada para pequeños proyectos y así garantizamos legalmente que nuestro trabajo se podrá seguir compartiendo y ampliando con el tiempo y se impedirá la creación de patentes hechas a base del mismo.
  • En la línea 17, entre paréntesis, colocamos el patrón de archivos a buscar para redimensionar. Nosotros utilizamos “P*.JPG” por nuestra cámara marca Panasonic que le agrega ese prefijo seguido de una numeración única y consecutiva.
  • Línea 18: asignamos el nombre del archivo donde guardaremos los nombres de los archivos a redimensionar. Nota: de hecho sabemos que hay una estructura alterna más eficiente para procesar archivos: “for file in *.png; do comando; done”, la idea de utilizar un archivo auxiliar es para, a futuro, poder llevar auditoría o registro de los archivos modificados. Es así que podemos, por ejemplo, cambiar el nombre de “lista.txt” a “archivos_redimensionados_dia_mes_año.log” por la extensión utilizada en inglés para el verbo “to log” o registrar o llevar un registro.
  • En la línea 19 limpiamos la consola para legibilidad en la ejecución de la tarea.
  • En la línea 20 buscamos los archivos que cumplan con el patrón de búsqueda de la línea 17 y guardamos sus nombres -para posterior uso- en el archivo nombrado de la línea 18.
  • De la línea 22 a la 28 se encuentra el ciclo o rutina principal deseado. En la línea 20 borramos -a menos que debamos hacer auditoría- (ver explicación de la línea 18). Con la línea 21 notificamos al usuario que la tarea ha finalizado (más sin embargo no llevamos una variable lógica -verdadero o falso- con los resultados de cada uno de los comando ejectuados, es susceptible de ser emjorado). A continuación mostramos las líneas debidamentes numeradas, trabajo hecho y alojado cortesía de Github:

Ahora pasamos a describir la rutina principal:

  • En la línea 21 comenzamos a leer el archivo “lista.txt” el cual contiene los nombres de los archivos con los cuales trabajaremos.
  • Entre la línea 21 y 28 establecemos el ciclo que se ejecutará hasta que hallamos leído de manera secuencial todos y cada uno de los nombres almacenados.
  • En la línea 23 le indicamos al usuari sobre cual archivo vamos procesando.
  • Línea 24: aquí es donde utilizaremos a imageMagick con la variable “$linea” que contiene el archivo que redimensionaremos (ver línea 23). Usamos el argumento “-resize” para obtener una imagen de 1024 por 768 píxeles reemplazando el archivo original.
  • Línea 26: llamamos a un “script” o guión en lenguaje PHP. Lo explicaremos en la sección siguiente, pero os adelanto que de allí obtendremos un archivo totalmente nuevo.
  • Línea 27: borramos el archivo original a fin de ahorrar en espacio en disco (no, no importa si ya tenemos discos duros con decenas de terabytes: cuando montamos un servidor web que reciba decenas de miles o incluso millones de visitas el ahorro de espacio en disco en muy importante).

Uso de PHP en un guión o archivo de proceso por lotes.

Aunque a la fecha no hemos escrito un tutorial sobre lenguaje PHP podemos adelantar que es un lenguaje de proceso por lotes de lado del servidor lo cual lo convierte en una poderosa herramienta para realizar páginas web de manera dinámica e interactiva con el usuario.

Ya vimos cómo con el lenguaje de marcación HTML5 podemos “escribir” o hacer páginas web pero limitadas a presentar siempre el mismo aspecto, y para cambiarlo debemos tomar el archivo, editarlo y guardarlo para, por ejemplo, agregar una nueva imagen o texto a nuestra web. Con el lenguaje PHP podremos, mediante un guión -con extensión .php- insertar comandos que responden a variables para, por ejemplo, mostrar diferentes logotipos según el tamaño de pantalla del dispositivo con la cual visitan nuestra página e incluso conectarnos a una base de datos para extraer texto, imágenes o cualquier otra información allí almacenada y así “personalizar” nuestro portal web. Es por ello que se habla de “páginas web estáticas” y “páginas web dinámicas”: con PHP obtenemos HTML según lo que necesitemos exhibir de acuerdo a variables de tiempo o valores específicos.

De hecho, el lenguaje con que funciona este blog está escrito en PHP y al conjunto de guiones -o procesos por lote- se denomina WordPress y estas líneas están guardadas en una base de datos MySQL. Hay muchísimos tutoriales sobre lenguaje PHP que podéis buscar con DuckDuckGo así que no profundizaremos demasiado en esta presentación pero es necesario que para continuar nuestra enseñanza visitéis, leed y comprended nuestra entrada sobre creación de imágenes CAPTCHA ya que las librerías que utilizaremos son las mismas. Y no os preocupéis, no vamos a montar un servidor web en el estricto sentido de la palabra, pero si usaremos elementos que se usan de manera común en ellos pero con la novedad de que lo ejecutaremos con la línea de comandos.

Línea de comandos en PHP.

En el sitio web oficial de PHP se describe detalladamente el uso de archivos PHP en una ventana terminal (linea de comandos). Allí detallan que hay tres maneras de ejecutar archivos con contenido PHP (no necesariamente con extensión “.php”) desde la línea de comandos:

  1. Decirle a PHP que ejecute un archivo específico, por ejemplo «php archivo.php».
  2. Decirle a PHP que ejecute lo que a continuación se escribe, siempre colocandolo entre comillas simples, por ejemplo «php -r ‘$algo=4; print_r($algo);’».
  3. Concatenar comandos “bash” con el símbolo de tubería “|”, eso en GNU/Linux es llamado standard input (stdin), por ejemplo «php -r ‘phpinfo();’ | grep “GD”»

En la tercera opción colocamos un ejemplo para conocer si tenemos instaladas las librerías GD necesarias para nuestro caso: insertar un logo en todos de cada una de las imágenes que deseamos redimensionar. Al ejecutarlo podremos ver algo como esto:

php -r 'phpinfo();' | grep "GD"
php -r ‘phpinfo();’ | grep “GD”

Buscamos que “GD Support” esté habilitado, “enabled”; caso contrario debemos instalarlo con la siguiente orden:

sudo apt-get install php5-gd

Asimismo se indica que se le pueden pasar argumentos dados al ejecutar un guión PHP invocandolos dentro del guión con el comando “$argv[]”. Se debe colocar entre corchetes el número de argumento en el mismo orden que se escribe en la línea de comandos, haciendo la salvedad que $argv[0] siempre será el nombre del archivo que contiene las instrucciones en lenguaje PHP.

Veamos unos sencillos ejemplos:

  • Creamos un archivo php con el siguiente contenido:
<?php
  print_r($argv[0])
?>
  • Luego llamamos al script con la siguiente orden «php archivo.php»
  • Por pantalla veremos algo parecido a esto:
php archivo.php
php archivo.php

Explicación de nuestro bash en PHP.

Como ya estudiamos de manera resumida y rápida el uso de la línea de comandos con guiones PHP, a continuación mostramos de manera numerada -cortesía de Github- el archivo de proceso por lotes “funde_logo.php“:

Y describimos línea por línea su funcionamiento:

  • En la línea 1 declaramos que usaremos el lenguaje PHP entre esta línea y la línea 46 (para este caso todo el archivo).
  • De la línea 2 a la 27 insertamos las licencias de uso, son dos porque la primera aplica al guión en sí, su código fuente, y la segunda para indicar que estamos utilizando código escrito en PHP que de por sí tiene su propia licencia de uso.
  • En las líneas 28~30 insertamos un comentario sobre lo que realizaremos.
  • En la línea 31 cargamos el archivo que recibimos desde el primera argumento externo (argumento externo) al guión mediante el comando imagecreatefromjpeg en la variable $destino .
  • En las líneas 32~33 insertamos comentarios adicionales.
  • En la línea 34 cargamos el archivo de imagen (que contiene el logotipo deseado en la imagen redimensionada creada  con anterioridad fuera del guión PHP) en la variable $origen.
  • Líneas 35 y 36 más comentarios.
  • En la línea 37 se hace el trabajo principal: insertamos el logotipo en la imagen con el comando imagecopymerge. Este comando merece una explicación detallada a continuación.
  • El comando imagecopymerge tiene los siguientes argumentos:
    1. El nombre del archivo que le insertaremos el logotipo.
    2. El nombre del archivo del logotipo.
    3. La coordenada X donde insertaremos el logotipo en la imagen.
    4. La coordenada Y donde insertaremos el logotipo en la imagen.
    5. La coordenada X del logotipo en si mismo.
    6. La coordenada Y del logotipo en si mismo.
    7. La anchura deseada del logotipo.
    8. La altura deseada del logotipo.
    9. El porcentaje de transparencia del logotipo: 100 es completamente opaco, no se mostrará nada el archivo original en el logotipo insertado
  • Líneas 38 a 40: comentarios.
  • Línea 41: preparamos lo que tenemos en memoria para volcarlo al disco duro con el comando imagejpeg con los argumentos siguientes: la variable $destino (a la cual le insertamos el logotipo), el nombre con el que queremos guardar el archivo (un prefijo llamado “CTL2016-” junto al nombre del archivo original pasado por el argumento externo al script PHP) y, por último, el nivel de calidad deseado, en este caso un 80%.
  • Líneas 42, 43, comentarios.
  • Líneas 44 y 45 liberamos la memoria donde almacenamos las imágenes.

Debemos aclarar que para saber las coordenadas donde insertaremos el logotipo, pues simplemente abrimos una de las fotografías tomadas con el software Pinta, luego abrimos el logotipo con el mismo programa en otra ventana, seleccionamos todo y copiamos, volvemos a la primera venta y pegamos y arrastramos a la posición deseada y tomamos nota de las coordenadas, hágase según arte como dicen en farmacia.

En cuanto a las coordenadas del logotipo pues sencillamente es TODO: de [0, 0] hasta [370, 150] : el ancho y alto total del mismo.

El comando “mogrify”.

Uno de nuestros “faros” en el mundo específico de Ubuntu es la página web Ubunlog.com quienes publicaron un mini tutorial con otro comando de ImageMagick: el comando mogrify.

Podéis ir a ese sitio web y leer (y aprender) sobre ese otro comando que nos permite redimensionar de manera masiva nuestras imágenes. Un detalle que notamos con este comando es que podemos redimensionar a cualquier tamaño específico pero si queremos -o necesitamos- que la imagen se ajuste (encoja y alargue, según sea el caso) debemos acompañar del signo de cierre de admiración para denotar esto. Es una ligera diferencia, he aquí un ejemplo de cada uno de los dos comandos:

mogrify -resize 800x200! prueba.jpg

El comando redimensionará exactamente a 800 píxeles de ancho por 200 píxeles de alto y la imagen se expandirá (en nuestro caso nuestra imagen original era de 3504×2332 píxeles) en ambas direcciones, por lo que se verá deformada.

mogrify -resize 800x200 prueba.jpg

En este caso NO utilizamos el signo de cierre de admiración (con la misma imagen de 3504×2332 píxeles) y al ejecutar el comando anterior nos produce una imagen de 201×200 píxeles lo cual respeta la relación ancho contra altura de la imagen original.

Converseen: interfaz gráfica basada en ImageMagick.

Como ImageMagick es Software Libre y está escrito en lenguaje C, el equipo de programación de fasterland.net en la persona de Francesco Mondello, sacaron partido de esto y desarrollaron una interfaz gráfica para otros sistemas operativos, con ustedes un bonito vídeo de presentación de Converseen:

En sus propias palabras:

Converseen, thanks to ImageMagick, the powerful image manipulation library on which the program leans it’s basis, can supports more than 100 image formats including DPX, EXR, GIF, JPEG, JPEG-2000, PhotoCD, PNG, Postscript, SVG, TIFF and many others.
Converseen is very easy to use, it’s designed to be fast, practical and, overall, you can get it for free!

Converseen incluso va más allá y le da valor agregado al permitir convertir un archivo en formato pdf en una serie de imágenes (por ahora desconocemos si las utilerías para manejar archivos en formato pertenecen a ImageMagick y por eso decimos que es un valor agregado):

Como podéis observar, Converseen PERMITE redimensionar de manera masiva las imágenes de una o varias carpetas e incluso ofrece una vista previa, prefijo para nombres de archivos (y ubicarlos en otra carpeta) y mucho más, ¡es como una navaja suiza!

Por último en esta sección, os dejamos el vídeo tutorial sobre cómo instalarlo en Ubuntu y el enlace hacia la propia página web del autor donde publica una entrada al respecto:

A nosotros en lo particular nos encanta la línea de comandos, donde para instalar Converseen solo debemos introducir estas dos sentencias (puede tardar algo de tiempo, dependiendo de su velocidad de descarga de internet):

sudo apt-get update

sudo apt-get install converseen

sudo apt-get install converseen
sudo apt-get install converseen

ImageMagick y la seguridad informática.

El Señor Pablo González, Ingeniero Informático, autor de numerosos libros en España y asesor de seguridad de reconocidas empresas radicadas en ese reino, publicó el jueves cinco de mayo de dosmildieciséis un artículo titulado “Command injection en ImageMagick: Actualiza todos tus servers GNU/Linux o te podrían hackear con una imagen” donde indica un fallo de seguridad en ImageMagick que permitiría ejecutar comandos bash con el nivel de usuario que hayamos colocado en nuestro servidor GNU/Linux.

Aunque esta parte es algo más avanzada para este humilde tutorial, dado lo delicado del asunto procedemos a explicarlo “en cristiano” o en castellano llano para que lo tengáis presente y trataremos de explicarlo lo más simple posible.

Como mencionamos ImageMagick está ampliamente extendido del mundo Unix de donde nació y tal como lo relatamos lo incorporaron a Linux y otros sistemas operativos. Pero bajo linux la potencia de ImageMagick se elevó a nivel tal que se usa mucho en servidores web con ayuda de otros lenguajes tales como (no limitados y/o combinados) HTML, PHP, PYTHON, etc.

He aquí que hay páginas web que ofrecen herramientas de edición y/o creación de imágenes a los usuarios. De hecho nosotros aprovechamos el código existente para crear CAPTCHAS para distintas páginas web de nuestros clientes (de nuevo, humildemente desarrolladas). En este caso es bastante seguro la creación de imágenes con PHP y sus librerías pero con ImageMagick hasta podemos permitir que nuestros usuarios web “suban” imágenes a nuestro servidor y allí es donde radica el problema.

Si un atacante malicioso -o no- subiera una imágen con código embebido meticulosamente manipulado para tal efecto al aplicarle el comando convert que estudiamos permite ejecutar el comando “infectado” en la línea de comandos.

El caso está ampliamente documentado en el siguiente enlace, pero no pudimos reproducir el comportamiento del fallo esperado porque regularmente mantenemos actualizados nuestros equipos a los repositorios oficiales.

Enlaces relacionados.

Enlaces en idioma castellano:

Enlaces en idioma inglés:

Git logo.

Git tutorial

Por medio de Twitter uno se entera de muchas cosas, dejando a un lado el maligno cotilleo, claro está. Una de esas cosas buenas es conocer que existe “Pro Git Book” el cual fue escrito por Scott Chacon (empleado hoy en día en la empresa GitHub) y Ben Straub (quien ahora trabaja en la empresa Zendesk) sobre el famoso sistema de administración (de versiones) de código fuente que tal como su nombre pomposo indica, es un software orientado a mantener en orden nuestros “apuntes” (ea , que estamos en el siglo XXI y ya debemos dejar de hacer esto, que yo también lo hacía, perdonadme Romero):

Git tutorial.

Introducción.

Esta entrada tiene como objetivo la instalación de Git en nuestros ordenadores y su aprendizaje básico teniendo como guía de escritura al famoso libro “Pro Git” 2° edición, osea un Git tutorial en toda regla. Luego veremos las opciones avanzadas, de las cuales muchos prescindiréis, especialmente la instalación de nuestros propio servidores de repositorios, pero no os quiero abrumar con más detalles, entremos en materia y recordad que si queréis ir más lentamente descargad y leed el libro (está escrito bajo licencia GNU General Public License) o mejor aún, compradlo y colaborad con los autores y además contribuid a otra buena causa.

Mini tutorial Git y chuleta de comandos.

Para aquellos de vosotros que os pasáis apurados todo el tiempo os recomiendo un resumen realizado por “El Baúl del Programador” el cual contiene, basado en el libro ProGit, los comandos básicos agrupados por similaridad de funciones junto con ejemplos prácticos de los escenarios que regularmente se nos presentan, he aquí el enlace al artículo y la cuenta en Twitter por si queréis seguirlos:

Brevísima historia de Git.

Git logo.
Git logo.

Ya en 1998 el equipo de desarrollo del sistema operativo GNU/Linux, encabezado por Linus Torvalds, observó lo difícil que era llevar bajo control el crecimiento (debido a que cada día se unían más entusiastas a la causa del software libre) del novedoso proyecto. Tanto es así que en 2002 se decide encomendar a la empresa BitMover -recién fundada dos años antes- la tarea de mantener “en custodia”, por medio de su producto estrella BitKeeper, las valiosísimas líneas de código del mayor emprendimiento hecho sobre software libre hasta la fecha. Al padre Richard Stallman por supuesto que no le gustó para nada este software “semi-privativo” (el adjetivo es inventado por nosotros, si es que no existía o existe ese concepto) ya que, si a ver vamos, era sin valor monetario para la comunidad en desarrollo a costa de comprometerse a no utilizar ninguna otro software para control de versiones -privativo o libre- mientras utilizaran BitKeeper e incluso un años más allá después de haberlo dejado de usar (menos mal tenían acceso al código fuente de BitKeeper). Tampoco podían participar en el desarrollo de algún software para control de versiones nuevo y como guinda para el pastel debían ser informados de manera automática de los cambios al GNU/Linux (con ayuda de los propios servidores de BitMover).

¿Qué es software libre? CTL2016 explica.
¿Qué es software libre? CTL2016 explica.

A muchos programadores esto no fue para nada de su agrado, una de las principales características de la filosofía del conocimiento abierto es precisamente la LIBERTAD. A pesar que el propio Linus Torvalds hizo llamados públicos y notorios a quien tuviera una alternativa totalmente bajo licencia GNU, nadie respondió ni ofreció ninguna herramienta de hecho, hay que tener cojones para desarrollar software para creadores de software: estaís en el ojo del huracán todo el tiempo. Mientras tanto intentaron edulcorar la agria relación con parches que hicieran compatible los servidores de BitMover con “Concurrent Version Systems” y “Subversion” pero el terrible cotilleo por internet que menciono al principio de este artículo echó por la borda cualquier intento de progreso.

En el año de 2005 la empresa BitMover amagó con empezar a cobrar por la licencia de uso pero Andrew Tridgell (padre también del rsync y Samba Server) ya estaba “prevenido al bate”: en aquella época él era empleado de “Open Source Development Labs” (OSDL) -predecesora de lo que hoy es “The Linux Foundation“- y tenía un as bajo la manga: “SourcePuller”.

Como mencionamos Andrew Tridgell fue padre del software Samba, el cual es basado -y ampliado- en el protocolo de recursos compartidos de la empresa Microsoft bajo su sistema operativo Windows –empresa que, por demás, nunca hizo queja alguna sobre ese invento hecho bajo software libre- y aplicó la misma técnica sobre el BitKeeper e inventó el “SourcePuller”. Pero se extralimitó ya que contrato leonino impuesto por BitMover sobre OSDL prohibía expresamente cualquier mejora (hasta el propio Linus Torvalds quedó salpicado en el asunto, al ser empleado también de OSDL tampoco podía participar en ningún desarrollo de software de control de versiones). Es de nuestra opinión que BitMover ya estaba ansiosa de obtener dividendos sobre su inversión y vieron en el trabajo de Andrew la excusa perfecta -violación de contrato- para cobrar por la licencia de uso y no al contrario -hay una extensa discusión sobre el tema (ver abajo enlaces de las fuentes) pero escapa de este humilde tutorial-.

Es por tanto que de todo lo anterior nace Git en el año 2005, y evidentemente que Linus Torvalds fue el titiritero detrás de todo el asunto: una vez le fue consultado sobre el origen del nombre “Git” a lo cual respondió (recordad que él es finlandés y por cercanía geográfica aprendió el inglés británico antes de ser ciudadano estadounidense; las fuentes coloreadas son mis observaciones):

  • Una combinación de tres letras impronunciables y que no son ningún comando en Unix. El hecho que provenga de una mala pronunciación de “get” (obtener) es irrelevante (deriva del inglés antiguo; “get” se pronuncia rápidamente mientras que “git” se alarga, es casi lo mismo pero a diferentes velocidades).
  • Estúpido. Vil y despreciable. Sencillo. Escoja usted del diccionario de jergas (de hecho en el inglés antiguo significaba “bastardo”).
  • “Información de Seguimiento Global”: si usted tiene un buen estado de ánimo, y realmente funciona para usted. Los ángeles cantan, y un resplandor llena de repente su habitación.
  • “Maldito camión cargado de mierda”: cuando se echa a perder (por las iniciales en idioma inglés “Goddamn Idiotic Truckload of shit”).

Como vemos el señor Linus Torvalds es lo que nosotros por acá llamamos una verdadera chupeta de ajo. Es por ello que tomamos aire y decimos a todo pulmón “VERGACIÓN LINUS ERES UNA PERSONA REALMENTE JODIDA” ja ja ja. 😉

Para que podáis entender el panorama infromático al momento del nacimiento de Git, en este mensaje de Linus Torvalds a al comunidad, fechado el miércoles 6 de abril de 2005 (en idioma inglés) están los detalles del punto de inflexión en la herramienta para desarrollar el kernel del GNU/Linux -y fue para mejorar, indudablemente-.

A partir del nacimiento de Git, Linus Torvalds designó al japonés e ingeniero en software Junio C. Hamano (濱野 純) el mantenimiento y desarrollo de Git. Hamano, quien es empleado de la empresa Google llevaba un blog hasta 2011 donde regularmente informaba amablemente al público en general sobre su trabajo pero luego decidió, para su paz mental, mudarlo al principal rival de WordPress: Blogspot (empresa comprada por Google en el año 2003).

El útimo anuncio en dicho blog describe el lanzamiento de la versión 2.5 de Git en julio de 2015 aunque a la fecha de escribir estas lineas están trabajando en la versión 2.8.

This is Git. It tracks collaborative work on projects on through a beautiful distributed graph theory tree model.
This is Git. It tracks collaborative work on projects on through a beautiful distributed graph theory tree model.

De la propia página personal de Hamano observamos una referencia a la anterior imagen, lo cual es una clara señal de que el hombre se toma las cosas con mucha, muchísima calma, a diferencia mayúscula de su jefe Linus Torvalds.

A la fecha se espera la llegada de la versión 2.9.1, según reseña la página web tutorial de LXALinuxAdictos y os adelanto, si queréis leer el reportaje, que allí expresan una muy resumida historia del Git, directo y al grano. Es bueno el artículo, pero nosotros aquí, como véis, somos de muchas más palabras 😉 .

 

Por otra parte, el protocolo Git se ha extendido a nivel mundial, tanto es así que el libro que vamos a estudiar ¡ha sido traducido al idioma coreano!

Presente y futuro de Git.

El primer caso de éxito para el protocolo y programa Git -y que ya lo hemos nombrado y referenciado bastante- es el caso de GitHub. Es tanto así que en el libro por el cual nos guiamos para esta enrada tiene su capítulo aparte y dedicado. La cuestión es simple: ellos dan alojamiento a proyectos cuyo control de versiones es manejado por medio de Git -por supuesto y lógico- y dicho alojamiento es libre y gratuito mientras sea público, allí está la “pega” del asunto. Si vosotros queréis llevar un proyecto privado y en azul celeste, pues que vuestro dinero os cueste, y por eso cobra y vive GitHub. Claro hay otros privilegios adicionales y se decide comprar alojamiento privado: total confidencialidad del proyecto, respaldos, páginas web, etcétera y cobran de acuerdo al tamaño del proyecto, esto es así porque nadie trabaja gratis, todos tenemos nuestros gastos.

Pero el asunto del GitHub va mucho más allá del ámbito de la programación. Desde escribir un libro (como el que comenzaremos a estudiar aquí) y gestionar su traducción a otros idiomas hasta leyes, control de planificación de ciudades o gente que programa drones, hay de todo un poco. Si queréis ahondar en los usos actuales (y tal vez veaís el futuro) os recomiendo leer el excelente reportaje en este enlace, gracias al sitio web “El Baúl del Programador”.

Instalación de Git en Ubuntu.

Superada la jocosa personalidad del padre de Linux, vamos a la parte seria del artículo: Git tutorial. Estamos aquí por instalar en nuestro ordenador con Ubuntu el programa Git. Esto vale también para la mayoría de distribuciones basadas en Debian. Abrimos una ventana terminal (si necesitan ayuda con esto pueden leer nuestro tutorial sobre bash) y tecleamos lo siguiente:

sudo apt-get install git-all

Introducimos nuestra contraseña para ganar acceso como usuario maestro “root” y podremos observar algo como esto (si desea haga click en la imagen para ampliarla):

sudo apt-get install git-all
sudo apt-get install git-all

Y listo, eso es todo, luego de descargar aproximadamente 30 megabytes y ocupar 139 megabytes en disco duro a la final se instalará un “gitdaemon”, es decir un servicio que estará siempre al pendiente de nuestro proyectos. Más adelante, en la sección avanzada, veremos y ahondaremos en este punto.

Características de Git.

Nuestro primer proyecto con Git.

Ramificaciones (avanzado de aquí en adelante).

Git en nuestro(s) propio(s) servidore(s).

Git en entornos distribuidos.

GitHub.

Herramientas en Git.

Personalización de Git.

Git en otros sistema de control de versiones.

Asuntos internos en Git.

Git en otros medioambientes.

Incrustando Git en tus aplicaciones por medio de la línea de comandos.

Humor.

 

Fuentes consultadas.

Artículos en idioma castellano:

Artículos en idioma inglés:

Enlaces mediante Youtube (en inglés):

Enlaces mediante Twitter (en inglés):

https://elbauldelprogramador.com/21-aliases-utiles-para-git/
https://elbauldelprogramador.com/como-usar-los-filtros-smudge-y-clean-en-git/
https://elbauldelprogramador.com/sincronizacin-de-proyectos-en-git-con-hooks-ganchos/
https://scotch.io/tutorials/contributing-to-open-source-software-with-git

ssh-keygen

SSH keygen.

SSH keygen.

Con SSH podremos conectarnos de manera segura a nuestras máquinas remotas y ejecutar o automatizar tareas con la certeza de que nadie podrá indagar qué estamos haciendo, privacidad absoluta.

En un post anterior vimos y aprendimos nuestros primeros pasos para trabajar por línea de comandos (shell) en una ventana terminal. Si no lo recordaís o quereís refrescar la memoria pues visitadlo y regresa acá para continuar nuestro aprendizaje (que yo también escribo esto para que no se me olvide -y ayudo a otros también-).


ssh-keygen
ssh-keygen

Pues el tema que nos trae hoy consta de dos publicaciones de la cual ésta es la primera. Ya sabemos cómo manejar la terminal por atajos de teclado para listar, copiar archivos, renombrarlos, etc. Todo esto lo hacíamos así, directamente sentados en nuestro ordenador, en contacto físico con nuestro equipo. ¿Pero que tal si nosotros necesitamos conectarnos a alguno de los ordenadores de nuestro trabajo? ¿O si estamos de viaje conectarnos a nuestra computadora en casa?

Apartando el tema que necesitamos conocer la dirección IP que nos asigna nuestro proveedor de internet para conectarnos (eso ya será tema para una nueva publicación) en el mundo Linux hay software antiquísimo diseñado especialmente para esto. En un  principio nos ocasionará temor el dejar nuestros equipos así, abiertos al mundo y con tanto “hacker” suelto por allí, que ni siquiera el mayor imperio conocido en la historia de la humanidad ha podido capturar a Edward Snowden o a Julian Assange, ¿qué quedará para nosotros? Al final de estas líneas os mostraremos al menos una herramienta para ayudar a protegernos de accesos no autorizados.

La buena noticia -y que tal vez los tranquilize un poco- es que estos dos señores (y muchos más) utilizan lo que nosotros aprenderemos aquí. Se dice rápido y fácil pero detrás de esto mucha gente se devanó los sesos pensando fórmulas matemáticas, estadística y algoritmos para garantizar nuestro acceso a ordenadores remotos. Sin más preámbulos pasemos a describir dicha tecnología.

SSH “Secure SHell”

En informática el acrónimo de 3 letras SSH (“Secure SHell”) describe la conexión segura entre dos computadores por medio de un canal seguro basado en un protocolo de red que nos permite manejar una línea de comandos como si estuviéramos de cuerpo presente frente al ordenador. La definición en inglés es cortísima, pero bueno cosas de ese idioma, todo es corto y rápido, “como para ayer pues”. Una cosa que yo admiro, eso sí, de esa gente es LA PRACTICIDAD. Estas conexiones nos permiten administrar múltiples equipos, pero el asunto va mucho más allá. Yo me esfuerzo todos los días para llegar a ser un Administrador de sistemas perezoso y ser así algún día UN BUEN ADMINISTRADOR DE SISTEMAS. Podemos crear archivos de procesos por lotes escritos en formato .sh (bin bash) y que nuestra máquina local ejecute cada cierto tiempo prefijado con CRON pero lo aplique a una máquina remota (la idea es poder introducir variables de búsqueda o parámetros a programas desde nuestro equipo local y aplicarlo en la máquina remota).

Para ello debemos nosotros mismos introducir la contraseña de la máquina remota y hasta allí llega nuestro entusiasmo para automatizar tareas. Pero para ello inventaron el ssh-keygen, un algoritmo que nos permitirá conectar automáticamente “sin contraseña” pero con una seguridad muy robusta y comprobada millones de veces diariamente.

Vuelvo y repito, detrás de todo esto hay mucha ciencia y esfuerzo, lo que les describo es una simplificación para aprender el concepto que luego pueden ampliarlo con los variados enlaces que incluyo y que utilicé para escribir esta entrada en mi blog.

Cinco pasos para crear “login sin contraseña”.

Tanto como “sin contraseña” no es el asunto, realmente tendremos que colocar una sola vez nuestra contraseña para poder acceder a nuestra página remota. Luego son cinco los pasos necesarios para crear nuestras conexiones “sin contraseñas” o como dicen en inglés “SSH Passwordless Login Using SSH Keygen in 5 Easy Steps“. Dichos pasos, panorama general, son los siguientes:

  1. En nuestra computadora local generaremos una llave digital.
  2. Luego crearemos un directorio en la máquina remota donde reposará dicha llave digital.
  3. Acto seguido copiaremos la llave en sí (local->remota).
  4. Asignaremos en la máquina remota permisos de lectura a dicha llave.
  5. Nos conectaremos como prueba de que la llave funciona.

Fue más fácil decirlo que hacerlo, como siempre. Ahora paso a describirlo con un ejemplo, en mi caso tengo una computadora real corriendo Ubuntu 14 de 64 bits (máquina local llamada “KEVIN” cuya dirección IP local es 192.168.1.47) corriendo un software llamado VirtualBox que me permite correr máquinas con diferentes sistemas operativos, para nuestras pruebas nos vienen como anillo al dedo pues ahorramos en hardware y en tiempo. La máquina virtual que utilizaré tiene corriendo Debian 7 “wheezy” la cual será la máquina remota, su nombre es “postgresql” y su dirección ip de área local es, para este ejemplo, 192.168.1.27 (una máquina virtual con motor de base de datos que utilizo para pruebas de programación).

Instalando SSH en la máquina remota (Debian).

Debido a la sencillez de este paso no se los había mencionado pero es que tampoco podemos obviarlo porque es crucial para aplicar los 5 pasos que nos fijamos como meta. Por seguridad (pienso yo) el SSH no viene instalado de manera prefijada en las distribuciones Linux. Pensemos esto como que si no existe una puerta nunca podremos entrar. Lo que vamos a hacer ni siquiera es abrir una puerta, lo que vamos a realizar es romper la pared y empotrar nuestra puerta.

Es así que PRIMERO debemos estar sentados en la que será la máquina remota (-si se pierden retrocedan un párrafo y se ubican-) y abrir una ventana terminal y ejecutar la siguiente sentencia:

apt-get install ssh

Debemos estar conectados como superusuario, en esta oportunidad utilicé el comando su introduje mi contraseña de usuario y ordené la instalación del software necesario para hacer la conexión (recordar que la máquina remota ejecuta Debian).

Instalando SSH.
Instalando SSH.

Como ya estaba instalado me reporta que no fue instalado ni modifcado nada y nos recuerda que hay 2 actualizaciones por realizar (de nuevo esta parte da material para otra entrada aparte en mi blog). Ya con esto establecido pordemos continuar ahora sí con los cinco pasos siguientes.

Bono adicional: instalando SSH en Ubuntu.

Pues eso, tengo una máquina virtual para probar Ubuntu de 64 bits con la versión 16.04 Xenial Xerus [Ubuntu da nombres rimbombantes a sus distros (abrid este enlace si queréis saber su significado en inglés), pero ¿quienes somos nosotros para criticarlos? Hagamos nuestra propia distro para ponerle un nombre que nos guste, ja ja ja 😉 ].

En dicha máquina virtual abrimos una ventana terminal con CTRL+T (recordad de nuevo que es Ubuntu) e introducimos el correspondiente comando:

apt-get install ssh (1)
apt-get install ssh (1)
apt-get install ssh (2)
apt-get install ssh (2)

En este ejemplo si que vemos cómo se instala completo, y notad la generación de certificados digitales mínimos necesarios para funcionar. También, en la figura 2, veréis como la última liínea se generan disparadores para ufw, el firewall que utiliza Ubuntu, al final ampliaremos esto. Luego de realizado esto podemos probar la conexión y revisar si conecta correctamente:

ssh jimmy@192.168.1.130
ssh jimmy@192.168.1.130

Paso N° 1: creación de llave digital.

Tal vez esta sea la sección más llamativa del asunto. Necesitamos crear una llave digital que consiste en un montón de caracteres organizados según un algoritmo que hace esta llave única. Incluso tiene opciones para hacerl más segura aún, pero les dejo eso como tarea y se entusiasmen tanto como yo. Dicho esto usaremos la opción “simple”, sentados en la máquina local abrimos una ventana de terminal y tecleamos lo siguiente:

ssh-keygen -t rsa
Generando llave SSH.
Generando llave SSH.

Luego presionamos la tecla intro (enter) cuatro veces, osea, empleamos los valores que trae por defecto el programa generador de llaves. Aquí debemos notar dónde guarda la llave que acabamos de generar: en nuestra carpeta personal dentro de un directorio oculto llamado ssh, en nuestro ejemplo es “/home/jimmy/.ssh/”. Sabiendo esto nos vamos al siguiente paso.

Paso N° 2: directorio remoto para guardar llave.

Para copiar nuestra nueva llave digital en nuestra máquina remota necesitaremos introducir los siguientes comandos desde la máquina local:

ssh jimmy@192.168.1.27 mkdir -p .ssh

Como ven aquí ya comenzamos a correr comandos en la máquina remota (llamada “postgresql” y cuya dirección ip es “192.168.1.27”). Para ser más exactos ordenamos pro medio del comando mkdir crear un directorio oculto (observar el punto delante) y con la opción -p le decimos que obvie error si ya existe el directorio. Con esa opción la línea de comandos no devolverá respuesta alguna si todo va bien, el estoicismo de Linux es heredado del Unix. Ya habrán podido notar que la sintaxis del ssh consiste a dónde se va a conectar y si le colocamos algún otro comando seguido pues simplemente ejecuta ese comando en la máquina remota y “se desconecta”.

Si sólamente colocamos “ssh usuario@máquina” (y por supuesto introducimos nuestra contraseña  de usuario de la máquina remota) quedará la ventana terminal abierta para teclear los comandos que necesitemos, eso sí, cambiando el prompt o indicador (para nuestro ejemplo “jimmy@posgresql:~$“) para que sepamos dónde estamos ubicados.

Paso N° 3: copiando la llave a la máquina remota.

En el paso N° 1 anotamos dónde se guardó nuestra llave digital en nuestro ordenador local (opción por defecto, presionamos intro y escribir otra ruta). Ahora la copiaremos mediante:

cat .ssh/id_rsa.pub | ssh jimmy@192.168.1.27 'cat >> .ssh/authorized_keys'

De nuevo introducimos nuestra contraseña de  usuario en la máquina remota con la aclaratoria del uso del signo “tubería” | que se denota así, una barra vertical que indica pasar los resultados de un comando al otro. Vemos que usamos cat un comando que nos permite visualizar por pantalla el contenido de un archivo de texto (o cualquier otro archivo) sólo que con el uso del signo “tubería” lo que íbamos a ver por pantalla (contenido de la llave digital “id_rsa.pub”) se lo enviamos al comando ssh quien a su vez, como tiene un comando a su derecha, lo pasa al interprete de comando de la máquina remota. Aquí hagamos una pausa para asimilar el resto de la linea (3 comandos).

Así como el comando cat nos permite extraer y visualizar -por pantalla, por defecto-, también nos permite INTRODUCIR texto en un archivo con el uso de los dos signos “>>” pero cambiandole el nombre a “authorized_keys“; si el archivo existiera pues lo agregaría al final (que una máquina remota puede servir para conectarnos desde varias máquinas locales diferentes, cada una con su propia llave digital). De nuevo el estoicismo y sencillez de Linux se hace notar.

Paso 4: asignando permisos a la llave copiada.

Para que nosotros y sólo nosotros seamos los únicos que podamos usar esa llave digital en la máquina remota, debemos asignarnos permisos para nosotros, es decir, los otros usuarios registrados en esa máquina remota les cerramos la posibilidad de leer la llave que acabamos de copiar. De no hacer esto cualquier otro usuario registrado en esa máquina remota pudiera copiarla en un dispositivo e “instalarla” en otra computadora para tener acceso a dicha máquina remota con nuestras credenciales, suplantando nuestra identidad. Este esquema no lo he probado pero también se los dejo como tarea para que lo prueben y se den el gusto de escribirme diciendome que estoy equivocado en mis apreciaciones y conocimientos.

Para ello ejecutaremos el comando chmod a la derecha del comando ssh, ya conocemos bien la sintaxis:

ssh jimmy@192.168.1.27 "chmod 700 .ssh; chmod 640 .ssh/authorized_keys"

Lo único nuevo aquí es el uso del punto y coma para separar un comando de otro dentro del conjunto delimitado por las comillas dobles. En la máquina remota se ejecutará tal cual, lee el primer comando de la izquierda hasta que encuentre el punto y coma, ejecuta y luego sigue leyendo hasta conseguir otro punto y coma (o se acabe la cadena con la comilla que sirve para delimitar).

Paso N° 5: comprobar que funciona.

ssh keygen
ssh keygen

El paso más sencillo: ejecutar la conexión y comprobar “que no nos pide contraseña”, tecleando en la terminal lo siguiente:


Actualizado el sábado 24 de octubre de 2015:

Si quisiéramos conectarnos como usuario raíz o “root” el procedimiento necesitaría unos comandos -y ediciones- adicionales. No obstante la comunidad Linux recomienda NO hacerlo por razones de seguridad, lo mejor es crear un usuario en el grupo de “sudoers”.


Fail2ban para fortalecer servidor.

En esta segunda parte de la entrada nos dedicaremos a estudiar el programa Fail2ban para proteger nuestro servidor SSH revisando periódicamente los registros de acceso a nuestro servidor en búsqueda de síntomas que indiquen un ataque. Cuando un ataque es detectado, que cumplan los parámetros establecidos, Fail2ban actualizará nuestro iptables para bloquear la dirección ip del atacante (o al menos la dirección ip que recibimos) por un período de tiempo o incluso permanentemente. Fail2ban incluso nos avisará por correo electrónico del suceso, si le instalamos algunos programas adicionales. Por último tampoco podemos perder de vista el Ubuntu Fire Wall (ufw).

Instalación de Fail2ban.

Primero debemos verificar si nuestro servidor está actualizado con los últimos parches de seguridad (línea N° 1), luego instalaremos el Fail2ban en sí (línea N° 2), el programa sendmail si queremos recibir correo con informes de sucesos (línea N° 3) y configuraremos el firewall (en este ejemplo de Ubuntu) en las líneas N° 4 y 5:

apt-get update && apt-get upgrade -y
apt-get install fail2ban
apt-get install sendmail
ufw enable
ufw allow ssh

Y las capturas de pantalla para que veaís el resultado de las líneas 2° a la 5°:

apt-get install fail2ban
apt-get install fail2ban

 

apt-get install sendmail
apt-get install sendmail

 

ufw enable & ufw allow ssh
ufw enable & ufw allow ssh

Al instalar sendmail el problema no es la descarga del programa, que es rápido, sino el tiempoq ue tarda instalándose ya que revisa todo el sistema para instalar certificados digitales para la seguridad TLS y muchos otros valores así que paciencia con esto.

Configurando fail2ban.local

Fail2ban, al inciarse en nuestro equipo remoto (que ya tenemos listo para conectarnos “sin contraseña”) primero lee todos los archivos con extensión .conf (que trae por defecto) y luego lee los archivos con extensión .local que están ubicados en la carpeta de sistema /etc/fail2ban. Nosotros podemos aprovechar este comportamiento para nuestro beneficio copiando el archivo fail2ban.conf a fail2ban.local y editar la copia, dejando intacto nuestro archivo original (por si acaso algo sale mal, borramos fail2ban.local y repetimos el proceso):

cp fail2ban.conf fail2.local
cp fail2ban.conf fail2.local

Ahora abrimos con el editor de texto favorito (nosotros usamos nano en este caso) para ajustar los valores necesarios:

nano fail2ban.local
nano fail2ban.local

Podéis hacer click en la imagen para ampliarla en otra pestaña (si su navegador lo permite). Los valores son los siguientes:

  • loglevel: nos permite habilitar el nivel de detalle que nos presentará fail2ban: eventos críticos (“CRITICAL”), de error (“ERROR”), de advertencia (“WARNING”), nota (“NOTICE”), informativo (“INFO”), depuración (“DEBUG”). Por defecto está en “INFO”, cambiad a vuestro gusto.
  • logtarget: nos permite decidir a donde vamos a guardar el informe de fail2ban, por defecto en el archivo /var/log/fail2ban.log . Las otras opciones son STDOUT, STDERR y SYSLOG, esta última puede ser útil si queremos manejar por mensajes del sistema.
  • syslogsocket: como dijimos en el apartado anterior, si seleccionamos SYSLOG para que fail2ba.log nos envie el infrome de sucesos, podemos configurar para que automáticamente utilice la vía por defecto o si queremos ubicarlo en una ruta distinta (se puede dar el caso).
  • socket: nos permite comunicarnos con el “demonio” que corre el servicio fail2ban. Dejamos intacto esta línea, de lo contrario no podremos pasarle órdenes. En el mundo del software libre todo es cristalino y transparente, esta línea es útil a la hora de depurar errores de programación del fail2ban.
  • pidfile: cada vez que se inicie, en este archivo se guardará el PID del servicio (Process Identification Number), esto es un identificador único a nivel del sistema oeprativo y sirve, por ejemplo, si necesitamos eliminar el proceso de la memoria.
  • dbfile: fail2ban utiliza SQLite, un manejador ligero de base de datos, para guardar sus procesos en disco duro de manera indexada, lo cual nos permite buscar rápidamente el historial de eventos, así se detenga fail2ban. Permite establecer el proceso en memoria para rapidez -pero se perderán los datos al apagar el equipo- o simplemente no indexaremos nada (tal vez si nos conformamos con los avisos por correo electrónico pero pensamos que siempre necesitaremos saber más, por eso recomendamos dejarlo en su valor por defecto /var/lib/fail2ban/fail2ban.sqlite3). De este archivo podemos sacar datos si usamos la línea de comandos SQLite3.
  • Si establecimos en el apartado anterior el uso del manejador ligero de base de datos, podemos establecer en esta línea el tiempo máximo (en segundos) que se deben conservar los registros. Recomendamos establecerlo a 7 días en vez de las 24 horas que trae por defecto.

Configurando fail2ban.jail

En este archivo fail2ban.jail haremos lo mismo que hicimos con fail2ban.conf.: copiaremos el contenido de fail2ban.jail a fail2.local para conservar el archivo original. Nota: los desarrolladores advierten que fail2ban.conf será cambiado en cualquier momento en que actualizemos a una nuevar versión. De antemano ya habíamos previsto utilizar los archivos .local y así nos lo especifican en una nota al comienzo del archivo.

Los valores que contiene son los siguientes (usamos de nuevo el editor nano con derechos de administrador):

  • En la sección [INCLUDES] la etiqueta before indica que se lean primero los archivos .conf (ya describimos este comportamiento).
  • En la sección [DEFAULT] la etiqueta ignoreip permite colocar las direcciones ip a las cuales no le aplicaremos regla alguna. Por defecto trae en formato CIDR a la dirección especial de equipo local 127.0.0.1/8 y si queremos o necesitamos podemos colocar direcciones ip específicas e incluso podemos bloquear servidores de nombres de dominio DNS. Debemos separar con un espacio los diferentes valores. Así podríamos, por ejemplo, especificar que no aplicase regla alguna a nuestros fallidos intentos de conexión SSH desde nuestra red de área local (generalmente 192.168.1.X) con la siguiente notación CIDR: 192.168.1.0/24 (una subnet y 255 direcciones ip).
  • maxretry y findtime: el primer parámetro indica cuántos intentos fallidos y en cuál período de tiempo han de haber sucedido para bloquear la dirección ip del atacante. Por defecto el número máximo de intentos son 5 en 600 segundos (10 minutos) o menos.
  • bantime: si cumple con el punto anterior, en este parámetro especificamos por cuánto tiempo bloquearemos la dirección ip del atacante. Por defecto serán 600 segundos sin atender llamada desde esa dirección ip involucrada.
  • usedns: esto lo explicaremos por la utilidad más notable, ver si la dirección ip es dinámica por medio del reverso del DNS. Al llegarnos un ataque podemos usar su dirección ip al DNS bajo la cual está bajo control a fin de determinar si es una dirección ip fija a un nombre de dominio o si es una dirección ip dinámica que cambia constantemente entre los clientes de un proveedor de internet (ISP). La segunda utilidad es poder marcar en un formato legible para nosotros los humanos en el archivo de registro de eventos. Por defecto viene marcada como advertencia.
  • logencoding: permite codificar el archivo de registro, viene marcado como “auto” y esto quiere decir que se utilizará lo que tenga asignado el sistema operativo, Posibles valores: ASCII, UTF-8 (este último formato es útil para nosotros los latino hablantes: castellano, francés, italiano, etcétera).
  • enable: por defecto es falso “false” y permite habilitar el archivo jail correspondiente.
  • filter: permite que el archivo “interactue” con otros mensajes del sistema, dándole el nombre propio del archivo para pasarlo como variable. No tocar esta línea para nada.

Hacemos una pausa para separar los valores destinados al envío de correos del sistema:

  • destemail: por defecto root@localhost será quien esté informado de lo que esté sucediendo.
  • sender: quien envia el correo, se repite el valor root@localhost, como vemos “yo con yo” no es útil así que en destemail colocaremos nuestra dirección de correo electrónico.

Fuentes consultadas.

Aquí les coloco los que visité y leí para poder escribir esta entrada “con sabor venezolano”:

En idioma castellano.

En idioma inglés.

En idioma francés.

Nuestro “tuiteo” acerca de este tema:



<Eso es todo, por ahora>.

ALT+F2 Canaima Kukenan.

GNU/Linux: linea de comandos (bash shell).

Introducción al BASH shell.

Algo que acompaña a todas las distribuciones GNU/LINUX es la terminal de línea de comandos (Unix shell, bash shell, o simplemente “shell”) la cual puede ser lanzada en modo de superusuario (root) o con la identidad con que hayamos iniciado sesión (aunque aún así podemos ejecutar comandos con privilegios de superusuario anteponiendo el comando sudo acompañado de su respectiva contraseña) o “escalando” privilegios con el comando su (más contraseña).

Nosotros utilizamos la línea de comandos “bash shell” desde 1990 con al antiquísimo MSDOS y luego con el venerable Netware Novell en 1993 (hoy migrado a Linux) y no tenemos aversión alguna a esta forma de trabajar pero hemos vistos casos severos de usuarios que se marean y les duele la cabeza al tipear 10 ó 12 comandos por la terminal.

Desde aquellos años nuestros terminales de BASH shell, los monitores donde aprendimos la computación, tenían un ancho de 80 columnas (80 caracteres o letras),  justos lo que cabía de ancho -y todavía es la norma- en una impresora de matriz de puntos para una hoja tamaño carta (hoy A4 según normas ISO). Pero en los años 1980 la cosa no era tan fácil, os traemos a colación este vídeo para que comprobéis que lo que  a nosotros nos parecía una norma de maravilla, no fue tan fácil llegar hasta allí:

El entorno gráfico es bello, bellísimo pero en muchas oportunidades necesitamos algo que vaya al grano y funcione rápido e incluso que funcione de manera remota y de manera segura abriendo incluso comunicaciones diversas, pero no quiero abrumarlos ni abrumarlas, con que sepan que es una opción disponible es más que suficiente.

Actualizado el domingo 27 de agosto de 2017.

Un interesante reportaje en inglés, de apenas 7 párrafos de introducción, describe muy bien la historia del bash y lo podéis leer en este enlace.

 

Abrir una ventana terminal.

En Ubuntu la combinación de teclas para abrir el “bash shell” es CTRL+ALT+T pero cada distribución tiene su método, si es por medio de menú busquen algo como “Accesorios->Terminal” o sino algo parecido en “Herramientas del sistema”. Investigando un poco pude conseguir varios atajos de teclado y un “atajo” de ratón {si es que eso existe, si no pues lo cabo de inventar 😉 }.

Si pulsamos la combinación de teclas ALT+F1 nos mostrará el menú principal del sistema (probado en GNU/LINUX Ubuntu, Canaima y Debian).

El otro atajo de teclado que me parece más poderoso es la combinación ALT+F2 la cual nos permite ejecutar casi todo programa instalado en nuestra máquina. Para comprobar esto último probé en varias de mis máquinas virtuales, incluyendo Chromixium cómo abrir el BASH shell y las que nombré en el párrafo anterior.

BASH shell en Ubuntu 14:

alt+f2 ubuntu bash shell
alt+f2 ubuntu bash shell

BASH shell en Canaima Kukenan:

alt+f2 Canaima Kukenan bash shell
alt+f2 Canaima Kukenan bash shell

BASH shell en Debian 7:

alt+f2 Debian 7 bash shell
alt+f2 Debian 7 bash shell

BASH shell en Chromixium OS 14:

alt+f2 Chromixium bash shell
alt+f2 Chromixium bash shell

Muy probablemente su cuenta creada en la distribución Linux es limitada por razones de seguridad: esto se traduce en que no podrán instalar programas, periféricos como impresoras o incluso a acceder a estadísticas sin ingresar credenciales de superusuario (ya ustedes saben que me refiero al usuario root, en adelante simplemente lo denominaré en castellano). Es así que iniciaremos la terminal con nuestras credenciales y si necesitaramos hacer algo avanzado pues “escalamos” privilegios.

Una cónsola se verá algo así como la siguiente (yo utilizo verde sobre negro porque los monitores de la universidad, los antigüos CTR eran de ese color aunque el que yo poseía en mi casa era de un horrible color ámbar):

jimmy@KEVIN: ~_011

Hay otra manera de tener acceso a la terminal de linea de comandos: por medio de una cónsola virtual, presionando simultáneamente las teclas CONTROL+ALTERNO+F1.

Advertencia.
Advertencia.

Antes de que probéis la cónsolo virtual os debo advertir que NO funciona para nada el ratón, solamente por medio del teclado podréis salir de este modo a la cónsola virtual gráfica (generalmente con las teclas CONTROL+ALTERNO+F7). He de advertiros también que debéis iniciar sesión con usuario y contraseña, sin importar que ya hayas abierto sesión gráfica, es decir, no se heredan las credenciales. Lo bueno de utilizar la cónsola virtual es que contamos con una GRAN Y AMPLIA pantalla en “modo ASCII”, ideal para editar grandes archivos de texto. Por último debo indicaros que del F1 al F6 son 6 cónsolas virtuales totalmente independientes la una de las otras. Para más detalles en cuanto a personalizar vuestra ventana terminal os aconsejo leer el excelente artículo del Licenciado Pedro Ruíz Hidalgo en Ubunlog.com.

Este viejo no los aburre más con historias así que entramos en materia:

Manejo del cursor con el teclado en bash shell.

El título de este párrafo os parececerá redundante y lo que paso a explicaros aún más. El cursor siempre ha sido un símbolo “|” (cuando está en modo de inserción) o con un símbolo de bloque “█” cuando está en modo de sobreescritura y sirve para indicarnos dónde estamos tecleando (los monitores vienen con un modo de parapadeo automático y en modo gráfico esto depende del sistema operativo correspondiente).

Cuando se masificó el uso de los “mouses” o ratones nos llegó el concepto de puntero del ratón o simplemente puntero. Es así como el teclado maneja el movimiento del cursor y el ratón el movimiento del puntero siendo posible ubicar el cursor con ayuda del puntero a donde esté disponible, generalmente cuando el puntero cambia su forma al famoso icono de “doble te”.

Cuando estamos en la línea de comandos podemos usar las siguientes teclas para manejar nuestro cursor:

  • Tecla Flecha izquierda: nos movemos un caracter a la izquierda.
  • Tecla Flecha derecha: nos movemos un caracter a la derecha, si no se ha acabado la línea.
  • Tecla INTRO o “ENTER”, RETORNO o “RETURN” (hay dos en el teclado, tienen diferentes códigos, la historia es larga): indicamos al ordenador que introduzca en memoria la cadena de caracteres que hemos escrito, si hay comando(s) válido(s) los ejecuta, de lo contrario nos indica aproximadamente dónde puede estar el error(es) de nomenclatura.
  • Tecla Flecha arriba: repetimos última línea introducida, si hubiera.
  • Si estamos seguros acerca de ual es el último comando que introdujimos simplemente tecleamos “!!” y al presionar Intro lo “repetimos” (nos coloca también una línea previa con el comando en sí apra que veamos qué estamos solicitando, por si las dudas -uno de esos raror casos explícitos en GNU/Linux). También podemos introducir “!!” seguido de comandos adicionales, el detalle es el siguiente: con flecha arriba modificamos la última línea y aís queda grabada en el historial (más adelante hablaremos del historial) y con “!!” introduciremos una línea nueva al historial.
  • Tecla Flecha abajo: luego de pulsar Flecha Arriba podremos volver a una línea de comandos nueva “bajando” tantas veces hayamos “subido” con la otra tecla.
  • Tecla Inicio o “HOME”: nos permite ubicar el cursor a al inicio de la línea que estamos escribiendo.
  • Tecla Fin o “END”: nos permite ir al final de la línea.

Más adelante veremos combinaciones de teclas (tecla Control+otra tecla, por ejemplo). Esta sección la finalizamos con otro detalle: muchas veces necesitamos escribir una linea de comando muy larga y aunque la ventana gráfica que contiene la terminal la podemos redimensionar con el puntero (arrastrando) e incluso podemos escoger una fuente más pequeña para tener más espacio de escritura de caracteres, nuestro monitor tiene un ancho finito. Para estos casos utilizamos para concatenar el símbolo de barra invertida que le indica al ordenador de que a pesar de que presionemos la tecla Intro no la va a procesar si le colocamos el “\”

Generalmente usamos esta última opción con comandos que hay que pasarles parámetros:

Ventana de comando con barra invertida para pasar varios parámetros largos
Ventana de comando con barra invertida para pasar varios parámetros largos

Como veís en la imagen anterior, introducimos el comando, luego un espacio y una barra invertida, presionamos Intro y a continuación escribimos el primer parámetro acompañado al final de otro espacio y otra barra invertida; debemos tener cuidado al finalizar con todos los parámetros NO introducir la barra invertida y presionamos Intro de nuevo: así el ordenador procesa como una sola línea. Al finalizar de procesar el comando deseado y  cuando volvemos a tener entrada de teclado, podemos presionar la tecla Flecha Arriba y veremos la línea completa que introdujimos previamente.

Otros atajos de teclado para el BASH shell.

Nosotros mostramos predilección por las teclas que son evidentes en nuestro teclado: Inicio (Home) , Fin (End), AvPag (PgDown), etcétera PERO hay unas combinaciones que son muy útiles. Dichas combinaciones implican las “teclas muertas” o “teclas pasivas” (CONTROL, ALTERNO, INVERSO) presionadas primero y sostenidas mientras se presiona otra tecla. Acá tenemos una cuenta en Twitter que se dedica a recordarnos cada cierto tiempo el uso agresivo de la línea de comandos, acá unos cuantos que consideramos muy útiles:

 

Manejo del historial de comandos introducidos en el BASH shell.

Antes de comenzar a introducir comandos os digo de antemano que todos ellos quedan registrados en memoria (así apaguemos nuestro ordenador) y solo necesitaremos escribir el comando history para revisar el historial del “bash shell”. Como dicho listado puede llegar a ser muy largo, podemos presionar la tecla CONTROL+R y escribir una palabra clave y nos buscará rápidamente en cual linea (y nos ubicará en esa línea, presionando de nuevo CTRL+R podemos “navegar” tal como indicamos anteriormente). Por último, si deseamos borrar el historial solo debemos escribir “history -c” .

Combinaciones de teclas útiles.

Control+R es apenas una de las combinaciones, tal como describimos en la sección anterior, acá otros comandos adicionales:

 

Referencia de Comandos en Linux y su BASH shell.

Servidor GNU/linux ejecuntado lineas de comandos.
Servidor GNU/linux ejecuntado lineas de comandos.

Tomado de la traducción hecha por Alex Barrios (alexbariv at gmail.com) -cuenta Twitter @alexbariv (en desuso, cuenta actual @alexertech, página web donde imparte cursos: http://www.alexertech.com/ )- quien a su vez lo tomó de Jacob Peddicort en su blog “Unix/Linux Command Cheat Sheet”  bajo licencia “Creative Commons” con la cual les puedo ofrecer esta entrada reconociendo la autoría (“appropiate credit”). En este enlace alterno de mi propio servidor suministro dicho documento traducido en formato pdf, ya ustedes saben cómo es el internet y su dinámica en el alojamiento de páginas web.

Actualizado el martes 15 de agosto de 2017.

Encontramos una útil lista abreviada de comandos realizada por Peteris Krumins y compartida por el señor Fran en su cuenta Twitter, haciendo alusión a sus talleres GNU/Linux que imparte ¡enhorabuena!:

 

Comandos del sistema operativo.

Comando “date”.

Comenzamos por conocer nuestro entorno, nuestro ordenador (o un ordenador remoto, luego veremos cómo). El primer comando es “date” el cual nos devuelve la hora y fecha de nuestro equipo. A pesar de ser uno de los comandos más sencillos no os dejéis engañar por GNU/Linux: para saber cuales otras opciones tiene podemos escribir “man” + nombre de comando. Al invocar esta ayuda sobre comando, podéis subir y bajar con las teclas de dirección del teclado, así como avanzar o retroceder páginas con las teclas correspondientes (también podéis usar la rueda del ratón, si es que está disponible). Si queréis leer ayuda sobre el comando “man” en sí mismo allí presionaréis la tecla “h” -nemotécnico para “help”- y para salir del mismo usaremos la tecla “q” -nemotécnico para “quit”-.

Es así que podemos describir que el comando “date” puede ser utilizado tanto para saber la hora y fecha del ordenador así como para fijarlo (se necesitan permisos de administrador o “root”) , así como también para conocer hora y fecha de otras ciudades del mundo. A medida que toméis experiencia disfrutaréis del comando “date” e incluso podréis usarlo como herramienta para calcular fechas y horas en formatos personalizados (muy útil para cuando querramos introducir valores de tiempo en bases de datos). Paciencia, “Roma no se construyó en un solo día”. Mirad la siguiente animación en formato gif sobre unas pocas llamadas al comando de marras:

comando "date".
Comando “date”.

Comando “clear”.

Muchas veces necesitaremos “limpiar la pizarra” (recordad vuestros tiempos en la escuela y liceo donde nuestros profesores escribía con gis o tiza), para ello solo escribiremos “clear” y la tecla introducir o “enter”. Acá observamos que la rueda del ratón es útil para ir rápidamente hacia lo que acabamos de “borrar” (o usamos las barras de desplazamiento de la venta terminal, si es que estamos en modo gráfico).

Comando “cal”.

Ya sabemos visualizar o fijar la fecha actual ahora veremos cómo visualizar el calendario del mes actual (con la fecha actual resaltada): simplemente introducimos “cal” y presionamos introducir o “enter” -de ahora en adelante obviaremos el indicar que se debe presionar la tecla INTRO para ejecutar los comandos-. Otra cosa que os preguntaréis para qué utilizar este comando si podemos ver la bandeja del sistema con tan solo mover nuestra vista a la bandeja del sistema, pero recordad que en modo TTY tendremos absolutamente toda la pantalla para la línea de comandos o tal vez estemos trabajando con un servidor al cual no dispone de entorno gráfico -lo cual es más común de lo que se cree-.

Como ya es costumbre no nos quedaremos con esa descripción tan simple del comando, sino que ahondaremos en unos cuantos más:

  • Si queremos ver el mes de diciembre del año en curso: “cal -m 12“, donde “12” es el número de mes deseado.
  • Si queremos ver el mes anterior, el actual y el próximo: “cal -3“.
  • Si queremos ver el mes actual y los próximos 5 meses: “cal -A 5” (“A” es nemotécnico para “after”).
  • Si por el contrario queremos ver los últimos 5 meses y el actual: “cal -B 5” (“B” es nemotécnico para “before”).
  • El comando “ncal” permite ver el calendario en base a los días de la semana y acepta los parámetros anteriores, además de otros específicos para “ncal” como por ejemplo el día de comienzo de semana: “-M” para lunes -“monday”- y “-S” para domingo -“sunday”-.

Comando “uptime”.

Permite conocer la hora actual, el tiempo que ha estado encendida nuestra computadora, el número de usuarios conectados (cada ventana TTY que hayamos iniciado sesión o cada conexión SSH cuenta como usuario) y el promedio de carga de trabajo que presenta el equipo los últimos 1, 5 y 15 minutos. Con la opción “-p” (nemotécnico para “–pretty“) simplemente veremos el tiempo que ha estado ejecutando el sistema operativo.

Comando “w”.

Pues sí, ¡un comando de una sola letra! Este comando complementa a “uptime” ya que muestra la misma información pero con un reporte detallado de los usuarios conectados actualmente:

  • USER: Nombre de usuario.
  • TTY: Ventana TeleTYpe en uso (recordad que van del 1 al 6 en texto y 7 en gráfico).
  • FROM: El nombre del equipo donde está conectado (dirección IP), de ser remoto.
  • LOGIN@: Hora cuando inició sesión.
  • IDLE: Tiempo transcurrido -en minutos- desde que inició sesión.
  • JCPU: Tiempo acumulado -en minutos- de las tareas adjuntas a cada terminal.
  • PCPU: Tiempo utilizado -en minutos- de la tarea que indica en WHAT.
  • WHAT: muestra la orden que inició la ventana terminal o la última ejecutada.

Los argumentos que podemos pasarle al comando “w” son los siguientes, a saber:

  • -h” o “–no-header“: Muestra solamente los usuarios conectados (omite la información que lista el comando “uptime“).
  • -s” o “–short“: no muestra las columnas LOGIN@, JCPU ni PCPU.
  • -f” o “–from“: mo muestra de donde están conectados los usuarios (dependiendo de la distribución Linux utilizada, puede ser que no sea posible desactivar esta opción).
  • -i” o “–ip-addr“: muestra la dirección IP en vez de nombre de equipo.
  • -o” o “–old-style“: imprime espacios en blanco si el tiempo transcurrido es menor a un minuto.
  • nombre_de_usuario”: muestra las conexiones abiertas para un usuario específico; se pueden solicitar varios usuarios al mismo tiempo si se solicitan los nombres separados por comas.

Comando “whoami”.

Acá por fin vemos un comando sumamente simple: “whoami” nos devuelve el nombre con que iniciamos sesión. Solamente tiene dos argumentos: “-help” muestra la ayuda que nos indica que el otro argumento es “–version” que visualiza la versión que tenemos instalada. Tal vez nos parezca un comando tonto pero si lo usamos en un comando de procesos por lotes -“bash script”- podremos usar el comando “tubería” -“|”- para pasar esta variable a otros procesos más complejos. Por ejemplo, podremos crear un guión que comprima los documentos del usuario cada cierto tiempo con crontab y colocarle el nombre del usuario, acompañado con fecha y hora, al nombre del archivo comprimido y guardarlo en una ubicación remota.

Comando “finger”.

Un comando que NO viene instalado por defecto en Ubuntu  y debemos descargarlo con “sudo apt install finger“. Sirve para obtener el usuario, el nombre de usuario, directorio de datos personales, última conexión, último correo leído por dicho usuario e incluso la agenda almacenada. Un uso muy útil es para verificar si existe un usuario en particular, ya que dicho comando devuelve si existe o no en el equipo. Por demás está decir que con el comando “chfn” podemos cambiar nuestros datos personales para que pueda ser visualizado por otros usuarios del sistema.

Comando “uname”.

Con este comando podremos ver el sistema operativo utilizado, Linux. Si queremos ver toda la información del ordenador usaremos el argumento “-a” o “–all” o podremos ver valores específicos (de nuevo, por ejemplo, podremos realizar un guión que nos devuelva la versión Linux utilizada para instalar un programa por nosotros escrito). Los argumentos detallados son:

  • -s” o “–kernel-name“: nombre del kernel instalado.
  • -n” o “–nodename“: nombre del ordenador para indetificarse en la red de área local.
  • -r” o “–kernel-release“: subversión del kernel instalado.
  • -v” o “–kernel-version“: versión del kernel instalado.
  • -p” o “–processor“: tipo de procesador.
  • -i” o “–hardware-platform“: plataforma del procesador.
  • -o” o “–operating-system“: sistema operativo instalado.

 

Manejo de archivos con bash shell.

En la figura arriba mostrada aparece el siguiente prefijo de manera constante:

jimmy@KEVIN:~$ (cursor titilando)

 Esto me indica que estoy conectado con la cuenta de usuario jimmy en la máquina KEVIN seguido de “:~$”: todo esto es el indicador o prompt y al aparecer como el signo de pesos indica que somos un usuario sin privilegios (ya comentado en un párrafo anterior) y cuando tenga el símbolo almohadilla o numeral estaremos en modo de superusuario. El símbolo de la virgulilla nos indica que estamos en nuestro directorio raíz del sistema.

En este otro ejemplo trabajamos con una máquina con Canaima 4.1 Kukenan y como pueden observar el nombre del usuario coincide con el nombre de la máquina y estamos con derechos limitados, ver signo de pesos:

Captura de pantalla de 2015-04-16 21:27:26Volviendo a nuestro ejemplo original comenzamos por ver los comandos para el manejo de archivos por medio del BASH shell.

Comando “ls”.

Se define como “listar directorio” pero yo agregaría también que archivos también. Así como en una oficina hay escritorios con gavetas y documentos almacenados en ellas, en nuestros discos duros (=escritorios) cada gaveta (=directorio) guardamos hojas (=archivos) y estas hojas pueden tener diferentes tamaños, colores y usos (=extensiones de archivos). Esa es la abstracción más fácil para comprender, de manera física y humana, el sistema de archivos. Al introducir ls y presionar la tecla intro(ducir) o “enter” (dependiendo de cuál tipo de teclado tengan ustedes)

jimmy@KEVIN: ~_013En seguida notamos los colores que destacan los diferentes elementos (vuelvo y repito, estoy utilizando Ubuntu 14.04 LTS Trusty Tahr, muy probablemente el GNU/Linux que vosotros utilicéis sea diferente). Coloreado en verde son los archivos y en azul los directorios (nosotros los hombres distinguimos sólo un puñado de colores así que me disculpan la falta de precisión y/o daltonismo).

Los archivos contienen atributos que le indican al sistema operativo la fecha de creación, de modificación, quién es el propietario y a cual grupo de usuarios pertenece (ya les comenté que existe el root y su cuenta de usuario ¿recuerdan?) así como también si es de lectura, escritura y hasta si es oculto para los usuarios. En GNU/Linux ocurre que los archivos ocultos simplemente llevan un punto delante de su descripción (por favor, los que sepan la historia de esta “costumbre” pro favor comente a pie de entrada). Al introducir “ls -a -l” en el BASH shell obtendremos el siguiente resultado (la lista es larga, la captura de pantalla NO abarca todos los archivos y directorios listados):

jimmy@KEVIN: ~_014Como pueden obervar, podemos notar que siguen apreciendo “Descargas”, “Documentos”, “Escritorio” entre otros pero además los archivos y directorios ocultos que comienzan con un punto en su nombre. También notamos que aparecen unos arriba de otros, a modo de columna o simplemente en modo lista (de allí el parámetro “-l” del comando). Este modo de lista, de izquierda a derecha -como es el castellano-:

  • Tipo de archivo (“filetype”): el primer caracter si es “d” es un directorio (“directory”), de lo contrario es un archivo “-“.
  • Permisos de archivo (“file permissions”): los siguientes 9 caracteres (más adelante veremos qué significan al agruparlos en tríos de caracteres).
  • Enlaces (“links”): indica en qué nivel se encuentra, cuántas carpetas “por encima” tiene cada archivo o cada directorio. Para comprender estos volvamos al ejemplo de nuestra oficina en el mundo real: dentro de cada gaveta puedo tener hojas sueltas y además carpetas que agrupan folios; es como una estructura jerárquica en la que si queremos leer un documento debemos abrir la gaveta y luego abrir la carpeta: ésos son los niveles a los cuales se refiere.
  • Propietario (“user”): el usuario quien creó el archivo (o heredó, veremos más adelante).
  • Grupo propietario (“group user”): el grupo de usuario al cual pertenece el archivo o carpeta.
  • Tamaño en bytes que ocupa en disco.
  • Fecha de la última modificación.
  • Nombre del archivo o directorio.

Como podrán deducir, el parámetro “-a” del comando ls permite mostrar los archivos y carpetas ocultas; también es válido “juntar” parámetros que sean compatibles y escribir simplemente “ls -la” o “ls -al“, intenten y comprueben ustedes que produce los mismos resultados.

Si queréis ver una lista completa de los parámetros de cualquier comando sólo tendréis que escribir “man comando” (en este caso “man ls“) y obtendréis toda la información.

Comando “pwd”.

Si en algún momento se nos olvida en cual carpeta estamos trabajando simplemente utilizamos el comando pwd, esto es especialmente útil si personalizamos nuestro indicador o “prompt” (también podemos usar este comando para pasarlo como variable en archivos de procesos por lotes si queremos, por ejemplo, recorrer de manera recursiva el árbol de directorios para buscar un archivo: “pwd” nos indicará en cual directorio se encuentra).

Comandos “df”, “du” y “free”.

  • Con el comando “df” prodremos obtener la cantidad de espacio utilizado en nuestro disco duro.
  • Con el comando “du” nos dará la información de los archivos en una carpeta pero será una lista extensa.
  • Con “free” podremos observar la cantidad de memoria RAM y SWAP y con los parámetros -b lo podremos ver expresadas en bytes, con -k en kilobytes y así sucesivamente: -m, -g y si queremos subar ambas memorias incluiremos el parámetro -t.

 

Comandos “whereis” y “wich”.

  • Con el comando “whereis” podremos saber dónde se encuentra instalada determinada aplicación, si está instalada en neustro ordenador, ejemplo “whereis pinta“.
  • Con el comando “which” podremos saber dónde se ejecutará una aplicación, ejemplo: “which sh“.

Comando “cat”.

Muchas veces necesitamos “mostrar por pantalla” el contenido de uno o varios archivos de texto: pues bien a esto se le llama “standard ouput” o salida normal del BASH shell. El comando cat es capaz enviar a la salida normal todo lo que le envíen, incluso si se ejecuta sin parámetros todo lo que escribamos -y presionamos intro- lo observaremos por pantalla.

En este punto cabe recordaros que en GNU/Liux todo es un archivo incluso los procesos del sistema operativo, por ejemplo los siguientes comando nos devolverán datos interesantes de nuestro procesador y memoria en nuestro ordenador:

cat /proc/cpuinfo
cat /proc/meminfo
Como funciona la entrada y salida normal en GNU/Linux BASH.

Haremos aquí un pequeño paréntesis para poneros un ejemplo sencillo sobre cómo aprovechar la salida normal “output standard” del comando “cat” y para ello nombraremos al artículo publicado en Totaki.com (desconocemos su autoría) y donde explican rapidamente cómo funcionan los ciclos:

for j in `cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies`
do
  echo "Frecuencia: "$j" Hz"
done

En la línea número uno observamos todo lo que está entrecomillado: el comando “cat” lee un archivo que contiene las frecuencias disponibles del CPU en nuestro ordenador (en este año 2017 es común y frecuente que tengan dos o más núcleos como en nuestro caso que tenemos cuatro) y dicha salida es almacenada en una variable implícita hacia un ciclo evaluado en una variable j y que separa los elementos por medio del Separador Interno de Campos (Internal Field Separator) -espacio, tabulador, nueva línea- imprimiendo por pantalla todos y cada uno de los elementos.

De igual manera en otro artículo publicado en DigitalOcean sobre como instalar nuestro servidor web Ngix se hace eco de un truco para conocer nuestra dirección IP local, la asignada por nuestro enrutador de área local o bien la que nos asigna nuestro proveedor de internet cuando estamos conectados directamente al modem respectivo. Para ello podemos ejecutar una ventana terminal donde escribimos la siguiente orden:

ip addr show eth0

(si usáis un ordenador portátil conectado por inalámbrico, cambiad a eth0 por wlan0)

Si la ejecutamos en nuestra ventana terminal notaremos que es mucha más información que la que necesitamos (os invito a practicar directamente los comandos en vuestra computadora a medida que vayáis leyendo nuestro artículo) así que notamos que hay una palabra clave “inet” sobre la cual nos apoyaremos para extraer lo quenos interesa, así que ahora le agregamos el símbolo de tubería “|” acompañado de otro comando llamado “grep” el cual nos permite imprimir líneas de acuerdo un patrón -en este caso la palabra clave “inet“-:

ip addr show eth0 | grep inet

Como veréis ya estamos más cerca de nuestro cometido. Para seguir adelante usaremos la metodología de estudio de la Facultad de Ingeniería de la Universidad de Carabobo (donde nos quitaron a nosotros la costumbre de propinar coces a diestra y sisniestra) y os presentamos el resto de los comandos necesarios los cuales dejamos a vuestro estudio posterior –metodología de estudio: ésta es la letra A, la B, la C… ahora recitadme el abecedario completo aunque NO os lo hayamos enseñado aún-:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Preludio a los atajos de teclado.

Como un avance a la siguiente sección podemos indicaros que no es necesario escribir el nombre completo de las rutas y/o archivos: con escribir dos o tres letras y presionar la tecla tabulador nuestro shell completará automáticamente siempre y cuando el nombre del archivo o carpeta sea único con las letras que introduzcamos. Es por ello que si no “completa” entonces volvemos a presionar la tecla tabulador y nos mostrará una lista de carpetas o archivos que comiencen con las letras solicitadas. Acá podéis ver parte del proceso:

cat cpuinfo meminfo
cat cpuinfo meminfo

Volviendo a los atajos de teclado en bash shell.

Es sumamente útil sólo usar el teclado para trabajar en nuestra terminal pero la primera frustración que tendremos es la muy famosa acción “copiar y pegar“, una técnica que nació en las antiguas imprentas para aligerar el trabajo con los tipografías de plomo. La historia del por qué no funciona en el bash las combinaciones CRTL+C y CTRL+V es larga y está bien explicada (en inglés) en este enlace. Para hacer corta esta entrada sólamente les enseño que lo que debemos hacer es usar MAYÚ+CTRL+C (SHIFT+CTRL+C) para “copiar” y MAYÚ+CTRL+V para “pegar”.

Hasta aquí no representa mayor sacrificio de nuestra parte, lo podemos aprender rápidamente, sólo es cuestión de pulsar sólo una tecla más. ¿Recuerdan que les dije al principio sobre un “atajo de ratón”? Pues bien para seleccionar, aunque ustedes no lo crean, sólamente se puede seleccionar con el puntero del ratón, y luego usar las combinaciones de teclas descritas. Hoy en día los ratones generalmente traen tres botones: izquierdo, central (rueda) y derecho. Pulsando la rueda sobre un texto seleccionado COPIARÁ Y PEGARÁ AUTOMÁTICAMENTE EN DONDE TENGAMOS EL CURSOR. ¿Cómo puede sernos útil dicho comportamiento? Será cuestión primero de practicar cómo funciona para luego encontrarle uso. 😎 Aquí les dejo un video explicativo:

Otras combinaciones de teclas útiles:

  • CTRL+FLECHA IZQ o CTRL+FLECHA DER va de palabra en palabra, al principio de cada una, en la dirección correspondiente.
  • TECLA “INICIO” y “FIN” nos ubica al principio o al final de la línea que estemos introduciendo en el prompt.

Actualizado el lunes 29 de febrero de 2016, año bisiesto.

Por Twitter seguimos la cuenta @Ubunlog donde se dedican de lleno a publicar temas sobre GNU/Linux Ubuntu pero sin dejar de lado asuntos que son comunes a todas las “distro’s”. En esta caso en particular tuvimos la oportunidad de leer el artículo “Los 5 comandos que todo usuario de Linux debería conocer” y, con toda humildad, leemos todas las noticias que podemos para mantenernos actualizados. Una opción que NO conocíamos es el comando gksudo el cual nos permite, con derechos de superusuario, “correr” una aplicación gráfica, como por ejemplo gedit. Generalmente utilizamos nano para editar con la linea de comandos, pero a veces los ojos agradecen un entorno más agradable, y como la consigna es hagamos más con menos trabajo y/o con más agrado pues publicamos esta enmienda a nuestra entrada en el blog. Aquí tenéis el mensaje “tuit” publicado por nuestros “tutores” del otro lado del “charco”:

Es así que si deseamos “lanzar” gedit como superusuario pues tecleamos lo siguiente seguido de la tecla INTRO (“ENTER”) en el BASH shell:

gksudo gedit

Y si tecleamos solamente el comando gksudo pues se nos muestra una ventana gráfica para que podamos seleccionar el usuario que necesiteis utilizar:


Actualizado el viernes 29 de septiembre de 2017.

¿Cuales son los comandos que más utilizamos?

Para responder esta pregunta, la cual nos puede sorprender por su resultado, utilizamos el siguiente truco en este hilo creado por Brian P. Hogan (más abajo nuestro resultado, agregad el vuestro a al hilo en Twitter por favor):

history | awk '{print $2;}' | sort | uniq -c | sort -rn | head -n 10

Enlaces relacionados al BASH shell.

Enlaces relacionados (en castellano):

Cuentas en Twitter dedicadas a la terminal (y otras cositas adicionales):

Enlaces relacionados (en inglés) con el BASH shell:

Some funny facts about command terminal:

 

Enlaces relacionados en Twitter: