Bash

  • En esta oportunidad traigo una serie de ejercicios que he propuesto a mis alumnos de Sistemas Operativos y Distribuidos para aprender a trabajar con el intérprete de comandos (bash). Decidí publicarlos para aquellos que quieran poner a prueba sus conocimientos. Una actividad ideal para pasar un rato de diversión con GNU/Linux durante el fin de semana, y una buena oportunidad para ver como estamos de "finos" con la consola.

  • Esta semana tuve que desarrollar una solución para descargar un backup fresco a través de HTTP. Se trata de una de esas manganetas que lamentablemente uno tiene que implementar, sobre uno de esos sistemas que uno quisiera no administrar, para esos clientes que uno quisiera no tener. Sin embargo, cuando uno tiene una mentalidad positiva cuenta con la certeza de que de todo lo malo se puede sacar algo bueno, como por ejemplo: aprender algo nuevo.

  • En Bash, es posible obtener el código de retorno, también llamado estado de salida (exit status), del último comando ejecutado consultando a la variable $?.

  • El prompt es el carácter o conjunto de caracteres que se muestran en una línea de comandos para indicar que espera órdenes. Puede variar dependiendo del intérprete de comandos y suele ser configurable. En Bash el prompt se configura en la variable de entorno $PS1. Es posible definir un prompt personalizado modificando esta variable en el archivo de configuración individual .bashrc que se encuentra en el $HOME de cada usuario.

    Hay infinitos tutoriales y ejemplos en Internet para configurar el prompt en Bash, por ejemplo: Bash Prompt HOWTO, Arch Wiki - Color Bash Prompt, y muchos más. Por eso no me voy a extender mucho en este tópico y simplemente voy a demostrar cómo marcar el estado o código de retorno del último comando ejecutado utilizando un emoticon, por ejemplo una cara de gato enojado, ideal para nuestros servidores en producción.

  • Cuando se trabaja con la salida estándar (la pantalla o archivo donde se envía la información o flujo de salida de los comandos ejecutados) en Bash, puede ser útil o necesario borrar contenido (caracteres) luego de que ya ha sido enviado a la misma. Para ello, en sistemas GNU/Linux, se puede recurrir a la herramienta tput. He aquí algunos ejemplos de su uso.

  • En el momento de configurar la cuenta de root, durante la instalación de FreeBSD 10, se le asigna la shell csh o tcsh. Esta es la shell que utilizan tradicionalmente los sistemas FreeBSD y OS X. Para muchos linuxeros puede resultar bastante incómoda ya que, por ejemplo, no permite borrar utilizando la tecla suprimir (sólo se puede borrar con backspace). Ya sea por costumbre o gusto, posiblemente uno de los primeros cambios luego de la instalación del sistema sea instalar el intérprete de comandos Bash.

    En este artículo voy a explicar cómo se cambia la shell de un usuario en FreeBSD, ya que editar directamente el archivo /etc/passwd no es una opción viable.

  • Hoy liberé un nuevo script Bash, llamado "checkmyfarm", para dar soporte a mi sistema de actualización de servidores en paralelo. Este script tiene el propósito de enviar un único mail incluyendo el resumen de actualizaciones disponibles en todos los servidores de la granja, y reemplaza al viejo verificar_actualizaciones.sh (el cual corría individualmente en cada servidor). De esta forma, en lugar de recibir un mail por cada servidor, recibo un único mail con el resumen de actualizaciones disponibles en todos los servidores de mi granja.

  • He publicado una nueva versión de mi script mailgun-mta.bash, que ahora soporta el uso de opciones y argumentos de línea de comandos como destinatario, asunto y remitente. Mi idea (tal como mencioné en artículos anteriores) es lograr reemplazar el comando mail por este script. De forma que todo el correo saliente desde un servidor sea a través del servicio en la nube de Mailgun.

  • Este artículo tal vez les pueda servir al momento de desarrollar un script Bash. Existe una herramienta en Linux, llamada basename que permite desmenuzar una ruta a un archivo. Es decir, permite remover tanto la ruta al directorio como cualquier sufijo o extensión.

  • En este artículo voy a explicar cómo cambiar de usuario en los sistemas operativos Linux y *BSD desde línea de comandos, proveyendo un entorno para la nueva sesión (variables, aliases, etc.)

  • Muchas veces debemos realizar una tarea de mantenimiento en un servidor que involucra una cantidad de pasos, suele ser muy compleja, y a su vez requerir una cantidad importante de comandos. Si además se trata de un servidor crítico, debemos realizarla en el menor tiempo posible para no afectar a los usuarios y servicios. Como buen administrador de sistemas (sysadmin, en la jerga de los informáticos) uno debe documentar metódicamente todo lo que hace. He aquí el problema en estas situaciones, se debe realizar una tarea compleja en tiempo récord lo cual impide documentar mientras se ejecuta la tarea (lo que recomiendan todas las metodologías de gestión de tecnologías de la información). Es decir, no hay tiempo para cargar contenido en una Wiki, no hay tiempo para documentar. Al menos no hay tiempo para documentar mientras se ejecuta la tarea. Entonces no queda otra alternativa que documentar una vez finalizado, testeado y cerrado el caso, o peor, cuando tenga tiempo. El resultado es que la documentación termina siendo pobre, y muchas veces se pierden pasos y/o detalles importantes que afectan de forma crítica el éxito de la misión.

    Lamentablemente esta situación se repite a diario en la mayoría de los colegas sysadmins, quienes están tan saturados de trabajo que directamente nunca tienen tiempo para documentar nada (la documentación no es una prioridad para la Gerencia, gran error). Luego la empresa (o al menos la gestión de IT) para la cual trabaja Pepe (suponiendo que Pepe es el sysadmin) se vuelve Pepe-dependiente. A esta altura ya me fui por las ramas, estoy detallando aspectos de una mala gestión de IT, en lugar del tema que presenta el título.

    Volviendo al punto, este artículo describe el uso de una excelente herramienta que me ayudó a documentar en muchas ocasiones. La pregunta para afrontar el problema de forma exitosa es: "¿Cómo hago para guardar todo lo que escribí en la línea de comandos, incluyendo las salidas de los mismos, sin tener que copiar y pegar constantemente?". La respuesta es simple: utilizar el comando script.

  • Como saben, Linuxito ha migrado de un servicio de hosting tradicional (donde te dan un espacio y un panel de control en un servidor compartido) a un VPS (Virtual Private Server). ¿Qué es un VPS? Una simple máquina virtual (KVM, VMware, Hyper-V, VirtualBox) o contenedor (Docker, Jails, LXC) en la nube (cloud, en un centro de cómputos remoto). Un servicio de hosting compartido nos da todo "digerido", mientras que, cuando se trabaja con un VPS, uno es responsable de todo lo relacionado a software y servicios. Este artículo sirve como guía para aquellos administradores de sitios Web, montados en servidores virtuales en la nube, que desean implementar un sistema de copias de seguridad (backup) simple, eficiente y seguro, utilizando sólo las herramientas al alcance de la mano (sin recurrir a software específico de backup).

  • Si por alguna razón necesitamos que Bash no recuerde los comandos que introducimos (por ejemplo porque incluimos contraseñas en líneas de comandos), generalmente borramos el archivo ~/.bash_history luego de cerrar sesión. Aunque tal vez no sea conveniente, ya que el historial es una herramienta útil y estaríamos perdiendo el registro de todos los comandos ejecutados (no sólo los de la sesión en cuestión). La alternativa es editar el archivo, pero no es una solución elegante. Entonces lo mejor es desactivar temporalmente el historial.

  • En Bash, el comando . (punto) ejecuta un script Bash en el entorno actual. Usualmente Bash ejecuta un script (archivo de comandos Bash) en una subshell para que los cambios realizados en el entorno (por ejemplo utilizando los comandos cd, set, etc.) sean locales al script. Al utilizar una subshell, el script se ejecuta en un entorno separado, sin afectar el entorno actual. El comando punto cambia este comportamiento y logra que el script a ejecutar utilice el entorno actual.

  • En este artículo comparto un sencillo script Bash que desarrollé para calcular el uptime (el tiempo que ha transcurrido desde que ha iniciado) de un servidor HTTP Apache. No confundir con el uptime del sistema operativo (tiempo transcurrido desde que ha iniciado el sistema, se obtiene con el comando uptime), sino que se trata de obtener el tiempo que lleva en ejecución el servicio "apache2" (el cual puede ser mucho menor al del sistema operativo si el servicio ha sido reiniciado).

  • A veces necesitamos conocer la fecha (año-mes-día) del día de ayer para relizar ciertas tareas en scripts que corren diariamente y de forma automática. Más allá de evitar entrar en cálculos matemáticos en Bash o sh, calcular la fecha del día anterior no es una tarea trivial. ¿Qué pasa si se trata del primero de marzo? ¿Cuál es el día de ayer: 28 o 29 de febrero? Por ello es mejor relegar este tipo de cálculos a las herramientas especializadas como date. La belleza de la modularización o filosofía Unix (do one thing, and do it well) de las herramientas de espacio usuario en sistemas *nix.

  • Al desarrollar scripts Bash, frecuentemente se necesita o desea poder obtener ciertos parámetros en forma de argumentos de línea de comandos, es decir, al momento de invocar el script. Esta es una tarea sencilla si nuestro script necesita un único parámetro por línea de comandos. Sin embargo, si deseamos soportar cualquier número de argumentos y opciones que requieran o no un parámetro adicional, las cosas se complican. Especialmente si la mayoría de los parámetro son opcionales y deseamos soportar cualquier orden.

    Este artículo demuestra una técnica simple para recuperar opciones y parámetros como argumentos de línea de comandos al desarrollar scripts Bash.

  • La shell Bash maneja diferentes descriptores de archivo (file descriptors) para implementar las redirecciones. El descriptor número 0 corresponde con la entrada estándar (stdin), el 1 corresponde con la salida estándar (stdout), y el 2 con la salida estándar de errores (stderr). A diferencia de Bash, csh (intérprete de comandos por defecto en sistemas FreeBSD) no posee un descriptor de archivo (2) para la standard error (stderr). Aunque de todas formas es posible redirigir las salidas estándar y de errores a archivos separados.

  • Al desarrollar scripts, a veces es necesario trabajar con fechas utilizando la herramienta GNU date, parte del paquete coreutils. En este artículo voy a explicar cómo restar fechas en Bash, a fin de obtener la cantidad de semanas, días, horas o segundos entre las mismas.

  • La consola (intérprete de línea de comandos) CSH, instalada por defecto de los sistemas FreeBSD, tiene una funcionalidad muy interesante y útil que consiste en buscar en el historial cuando se utiliza la flecha hacia arriba.