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:

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: