¡Bienvenidos a esta guía de formación sobre los conceptos básicos de Bash!
En este curso intensivo sobre Bash, aprenderá los conceptos básicos de Bash para que pueda comenzar a escribir sus propios scripts de Bash y automatizar sus tareas diarias.
Bash es un shell y lenguaje de comandos de Unix. Está ampliamente disponible en varios sistemas operativos y también es el intérprete de comandos predeterminado en la mayoría de los sistemas Linux. Bash significa Bourne-Again SHell. Al igual que con otros shells, puede usar Bash de forma interactiva directamente en su terminal y también puede usar Bash como cualquier otro lenguaje de programación para escribir scripts.
Este libro lo ayudará a aprender los conceptos básicos de los scripts de Bash, incluidas las variables de Bash, la entrada del usuario, los comentarios, los argumentos, las matrices, las expresiones condicionales, los condicionales, los bucles, las funciones, la depuración y las pruebas. Para escribir scripts de Bash, solo necesita un terminal de UNIX y un editor de texto como Sublime Text, VS Code o un editor basado en terminal como vim o nano.
Tabla de Contenidos
Acerca del libro .................................................................................. 7
Acerca del autor ........................................................................... 8
Patrocinadores ................................................................................ 9
Herramienta de generación de Ebook en PDF ............................. 11
Portada del libro ............................................................................ 12
Licencia ........................................................................................ 13
Introducción a la programación en Bash ...................................... 14
Estructura de Bash ......................................................................... 15
Hola Mundo en Bash ...................................................................... 16
Variables en Bash .......................................................................... 18
Entrada de usuario en Bash .......................................................... 21
Comentarios en Bash .................................................................... 23
Argumentos en Bash ..................................................................... 24
Arreglos en Bash .......................................................................... 27
Expresiones condicionales en Bash .............................................. 29
Expresiones de archivos ............................................................. 30
Expresiones de cadenas .............................................................. 32
Operadores aritméticos ............................................................... 34
Condicionales en Bash ................................................................ 36
Sentencia If ................................................................................... 37
Sentencia If Else .......................................................................... 38
Sentencias Switch case ............................................................... 40
Conclusión ................................................................................... 42
Bucles en Bash .............................................................................. 43
Bucles For .................................................................................... 44
Bucles While ................................................................................ 46
Bucles Until ................................................................................. 48
Continue y Break ........................................................................ 49
Funciones en Bash ....................................................................... 50
Depuración, pruebas y atajos ..................................................... 52
Creando comandos personalizados en Bash ............................. 55
Ejemplo ...................................................................................... 56
Haciendo el cambio persistente ................................................. 58
Listando todos los alias disponibles ........................................... 59
Conclusión ................................................................................... 60
Escribe tu primer script en Bash .................................................. 61
Planificando el script ................................................................... 62
Escribiendo el script .................................................................... 63
Añadiendo comentarios ................................................................ 64
Añadiendo tu primera variable .................................................... 65
Añadiendo tu primera función ..................................................... 66
Desafío: añadiendo más funciones ............................................. 68
El script de ejemplo .................................................................... 69
Conclusión ................................................................................... 71
Creando un menú interactivo en Bash ......................................... 72
Planificando la funcionalidad ..................................................... 73
Añadiendo algunos colores ....................................................... 75
Añadiendo el menú ...................................................................... 76
Probando el script ....................................................................... 78
Conclusión ................................................................................... 82
Ejecutando scripts de Bash en múltiples servidores remotos ...... 83
Requisitos previos ..................................................................... 84
El script de Bash ........................................................................ 87
Ejecutando el script en todos los servidores ............................. 89
Conclusión ................................................................................... 91
Trabajando con JSON en Bash usando jq .................................. 92
Planificando el script ................................................................... 93
Instalando jq ............................................................................... 94
Analizando JSON con jq ............................................................ 96
Obteniendo el primer elemento con jq ...................................... 98
Obteniendo un valor solo para una clave específica .................. 99
Usando jq en un script de Bash ................................................ 100
Conclusión ................................................................................. 103
Trabajando con la API de Cloudflare con Bash ......................... 104
Requisitos previos ..................................................................... 105
Desafío - Requisitos del script ................................................. 106
Script de ejemplo ....................................................................... 107
Conclusión ................................................................................. 109
Analizador de scripts de Bash para resumir tus registros de acceso de NGINX y Apache .................................................... 110
Requisitos del script ................................................................... 111
Script de ejemplo ....................................................................... 112
Ejecutando el script .................................................................... 113
Entendiendo la salida ............................................................... 114
Conclusión ................................................................................. 116
Enviando correos electrónicos con Bash y SSMTP ..................... 117
Requisitos previos ..................................................................... 118
Instalando SSMTP ...................................................................... 119
Configurando SSMTP .................................................................. 120
Enviando correos con SSMTP .................................................... 121
Enviando un archivo con SSMTP (opcional) ............................... 122
Conclusión ................................................................................. 123
Generador de contraseñas con script Bash ................................ 124
:warning: Seguridad ................................................................... 125
Resumen del script .................................................................... 126
Requisitos previos ..................................................................... 127
Generando una contraseña aleatoria ...................................... 128
El script ...................................................................................... 130
El script completo: .................................................................... 131
Conclusión ................................................................................. 132
Contribuciones de ...................................................................... 133
Resumen ..................................................................................... 134
Acerca del libro
Esta versión fue publicada el 1 de febrero de 2021.
Este es un manual de código abierto para la introducción a la programación en Bash, que te ayudará a aprender los fundamentos de los scripts en Bash y comenzar a escribir increíbles scripts que te ayudarán a automatizar tus tareas diarias de SysOps, DevOps y desarrollo. No importa si eres un ingeniero DevOps/SysOps, desarrollador o simplemente un entusiasta de Linux, puedes usar scripts en Bash para combinar diferentes comandos de Linux y automatizar tareas tediosas y repetitivas, para que puedas concentrarte en cosas más productivas y divertidas.
La guía es adecuada para cualquier persona que trabaje como desarrollador, administrador de sistemas o ingeniero DevOps y quiera aprender lo básico sobre la programación en Bash.
Los primeros 13 capítulos estarán enfocados exclusivamente en obtener una base sólida sobre scripting en Bash, y luego el resto de los capítulos te ofrecerán ejemplos y scripts de la vida real.
Acerca del autor
El Autor es Bobby Iliev, y he estado trabajando como Ingeniero DevOps en Linux desde 2014. Amante apasionado de Linux y un firme defensor de la filosofía del movimiento de código abierto. "Siempre hago lo que no sé hacer para aprender cómo hacerlo, y creo en compartir el conocimiento.
Creo que es esencial mantener siempre una actitud profesional y rodearse de buenas personas, trabajar arduamente y ser amable con todos. Debes rendir a un nivel constantemente más alto que lo"s demás. Esa es la marca de un verdadero profesional."
Para más información, visita su blog en https://bobbyiliev.com, síguele en Twitter @bobbyiliev_ y en YouTube.
Patrocinadores
Este libro es posible gracias a estas fantásticas empresas:
DigitalOcean
DigitalOcean es una plataforma de servicios en la nube que ofrece la simplicidad que los desarrolladores adoran y en la que las empresas confían para ejecutar aplicaciones de producción a gran escala.
Proporciona soluciones de computación, almacenamiento y redes altamente disponibles, seguras y escalables, que ayudan a los desarrolladores a crear software de calidad más rápido.
Fundada en 2012, con oficinas en Nueva York y Cambridge, MA, DigitalOcean ofrece precios transparentes y asequibles, una interfaz de usuario elegante y una de las bibliotecas más grandes de recursos de código abierto disponibles.
Para más información, visita https://www.digitalocean.com o sigue a @digitalocean en Twitter.
Si eres nuevo en DigitalOcean, puedes obtener un crédito gratis de $100 y poner en marcha tus propios servidores a través de este enlace de referencia:
Crédito de $100 gratis para DigitalOcean
DevDojo
DevDojo es un recurso para aprender todo sobre desarrollo web y diseño web. Aprende en tu descanso para el almuerzo o despierta y disfruta de una taza de café con nosotros para aprender algo nuevo.
Únete a esta comunidad de desarrolladores y todos podemos aprender juntos, construir juntos y crecer juntos.
Para más información, visita https://www.devdojo.com o sigue a @thedevdojo en Twitter.
Herramienta de Generación de Ebook en PDF
Este ebook fue generado por Ibis, desarrollado por Mohamed Said.
Ibis es una herramienta PHP que te ayuda a escribir ebooks en markdown.
Portada del libro
La portada de este ebook fue creada con Canva.com.
Si alguna vez necesitas crear un gráfico, cartel, invitación, logo, presentación, o cualquier cosa que luzca bien, prueba Canva.
Licencia
Licencia MIT
Copyright (c) 2020 Bobby Iliev
Por la presente, se otorga permiso, de forma gratuita, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para tratar el Software sin restricciones, incluyendo sin limitación los derechos a usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del Software, y permitir que las personas a quienes se les suministre el Software lo hagan, sujeto a las siguientes condiciones:
El aviso de copyright anterior y este aviso de permiso deben ser incluidos en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITÁNDOSE A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR E INFRINGIMIENTO. EN NINGÚN CASO LOS AUTORES O TITULARES DE LOS DERECHOS DE AUTOR SERÁN RESPONSABLES DE CUALQUIER RECLAMO, DAÑO O CUALQUIER OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE CUALQUIER OTRA FORMA, QUE SURJA DE O EN CONEXIÓN CON EL SOFTWARE O EL USO O CUALQUIER OTRA GESTIÓN DEL SOFTWARE.
Introducción a la programación en Bash
¡Bienvenido a esta guía de entrenamiento sobre lo básico de Bash! En este curso rápido de Bash, aprenderás lo básico sobre Bash para que puedas comenzar a escribir tus propios scripts y automatizar tus tareas diarias.
Bash es un shell de Unix y un lenguaje de comandos. Está ampliamente disponible en varios sistemas operativos, y también es el intérprete de comandos predeterminado en la mayoría de los sistemas Linux.
Bash significa "Bourne-Again SHell". Al igual que otros shells, puedes usar Bash de forma interactiva directamente en tu terminal, y también puedes usar Bash como cualquier otro lenguaje de programación para escribir scripts. Este libro te ayudará a aprender lo básico de la programación en Bash, incluyendo variables de Bash, entrada de usuario, comentarios, argumentos, arreglos, expresiones condicionales, condicionales, bucles, funciones, depuración y pruebas.
Para escribir scripts en Bash, solo necesitas un terminal UNIX y un editor de texto como Sublime Text, VS Code o un editor basado en terminal como vim o nano.
Estructura de Bash
Comencemos creando un nuevo archivo con la extensión .sh. Como ejemplo, podríamos crear un archivo llamado devdojo.sh
.
Para crear ese archivo, puedes usar el comando touch
:touch devdojo.sh
O también puedes usar tu editor de texto:nano devdojo.sh
Para ejecutar/ejecutar un archivo de script Bash con el intérprete de shell Bash, la primera línea de un archivo de script debe indicar la ruta absoluta al ejecutable de Bash:#!/bin/bash
Esto también se llama un Shebang.
Lo único que hace el shebang es instruir al sistema operativo para que ejecute el script con el ejecutable /bin/bash
.
Bash Hello World
Una vez que tengamos nuestro archivo devdojo.sh
creado y hayamos especificado el shebang de Bash en la primera línea, estamos listos para crear nuestro primer script de "Hola Mundo".
Para hacer eso, abre el archivo devdojo.sh
nuevamente y agrega lo siguiente después de la línea #!/bin/bash
:
echo "¡Hola Mundo!"
Guarda el archivo y sal de él.
Después de eso, haz que el script sea ejecutable ejecutando:chmod +x devdojo.sh
Luego, ejecuta el archivo:./devdojo.sh
Verás el mensaje "¡Hola Mundo!" en la pantalla.
Otra forma de ejecutar el script sería:bash devdojo.sh
Como Bash puede usarse de forma interactiva, también podrías ejecutar el siguiente comando directamente en tu terminal y obtendrías el mismo resultado:echo "¡Hola DevDojo!"
Armar un script es útil cuando necesitas combinar varios comandos.
Variables en Bash
Al igual que en cualquier otro lenguaje de programación, puedes usar variables en Bash. Sin embargo, no hay tipos de datos en Bash, y una variable puede contener tanto números como caracteres.
Para asignar un valor a una variable, solo necesitas usar el signo =
:
name="DevDojo"
Nota importante: no puedes tener espacios antes ni después del signo =
.
Después, para acceder a la variable, debes usar el $
y referenciarla de la siguiente manera:
echo $name
Envolver el nombre de la variable entre llaves no es obligatorio, pero se considera una buena práctica y te recomiendo usarlas siempre que puedas:
echo ${name}
El resultado de lo anterior será: DevDojo, ya que este es el valor de nuestra variable.
Ahora, vamos a actualizar nuestro script devdojo.sh
e incluir una variable.
Nuevamente, con tu editor de texto favorito, abre el archivo:
nano devdojo.sh
Y actualiza el archivo para que se vea así:
"DevDojo" echo "Hi there $name"
name=Guarda el archivo y ejecútalo nuevamente:
./devdojo.sh
Verás el siguiente resultado en tu pantalla:
Hi there DevDojo
Aquí está un desglose del script:
#!/bin/bash
- Primero, especificamos nuestro shebang.name=DevDojo
- Luego, definimos una variable llamadaname
y le asignamos un valor.echo "Hi there $name"
- Finalmente, mostramos el contenido de la variable en la pantalla usandoecho
.
También puedes agregar múltiples variables:
#!/bin/bash
name="DevDojo"
greeting="Hello"
echo "$greeting $name"
Ten en cuenta que no es necesario agregar un punto y coma ;
al final de cada línea. Funcionará de ambas maneras, ¡un poco como en JavaScript!
Entrada de Usuario en Bash
Con el script anterior, definimos una variable y mostramos su valor en la pantalla con echo $name
.
Ahora, vamos a pedir la entrada del usuario en lugar de usar una variable fija. Para hacerlo, abre el archivo con tu editor de texto favorito y actualiza el script de la siguiente manera:
#!/bin/bash
echo "What is your name?"
read name
echo "Hi there $name"
echo "Welcome to DevDojo!"
Lo anterior solicitará al usuario que ingrese su nombre y luego almacenará esa entrada como una cadena de texto en una variable.
Luego podemos usar esa variable para imprimir un mensaje al usuario.
El resultado de este script será el siguiente:
Primero ejecuta el script:
./devdojo.sh
Escribe tu nombre y presiona enter, y obtendrás el siguiente resultado:
Hi there Bobby
Welcome to DevDojo!
Para reducir el código, podríamos cambiar la primera declaración echo
por el comando read -p
. El comando read
con la bandera -p
imprimirá un mensaje antes de solicitar la entrada del usuario:
¡Asegúrate de probar esto también!
Comentarios en Bash
Al igual que en cualquier otro lenguaje de programación, puedes agregar comentarios a tu script. Los comentarios se usan para dejar notas para ti mismo a lo largo de tu código.
Para hacerlo en Bash, necesitas agregar el símbolo #
al comienzo de la línea. Los comentarios nunca se mostrarán en la pantalla.
Aquí tienes un ejemplo de un comentario:
# Esto es un comentario y no se mostrará en la pantalla
Los comentarios son una excelente manera de describir algunas de las funcionalidades más complejas directamente en tus scripts para que otras personas puedan entender tu código con facilidad.
Argumentos en Bash
Puedes pasar argumentos a tu script de shell cuando lo ejecutas. Para pasar un argumento, simplemente necesitas escribirlo justo después del nombre de tu script. Por ejemplo:
./devdojo.com tu_argumento
En el script, luego podemos usar $1
para hacer referencia al primer argumento que especificamos. Si pasamos un segundo argumento, estará disponible como $2
, y así sucesivamente.
Vamos a crear un script corto llamado arguments.sh
como ejemplo:
#!/bin/bash
echo "El argumento uno es $1"
echo "El argumento dos es $2"
echo "El argumento tres es $3"
$@
:Obtenerás la siguiente salida:
Otra cosa que debes tener en cuenta es que $0 se usa para hacer referencia al propio script. Esta es una excelente manera de autodestruir el archivo si lo necesitas o simplemente obtener el nombre del script. Por ejemplo, vamos a crear un script que imprima el nombre del archivo y lo elimine después:
#
) mostrará el número total de elementos en el arreglo. En nuestro caso, es 4:Asegúrate de probar esto y practicarlo en tu sistema con diferentes valores.
Expresiones Condicionales en Bash
En informática, las sentencias condicionales, expresiones condicionales y construcciones condicionales son características de un lenguaje de programación que realizan diferentes cálculos o acciones dependiendo de si una condición booleana especificada por el programador evalúa a verdadero o falso.
En Bash, las expresiones condicionales se usan con el comando compuesto [[
y los comandos incorporados para probar atributos de archivos y realizar comparaciones de cadenas y aritméticas.
Aquí hay una lista de las expresiones condicionales más populares en Bash. ¡No tienes que memorizarlas! Puedes consultar esta lista siempre que lo necesites.
Expresiones de archivo:
- Verdadero si el archivo existe
- Verdadero si el archivo existe y es legible.
- Verdadero si el archivo existe y tiene un tamaño mayor a cero.
- Verdadero si el archivo existe y es escribible.
- Verdadero si el archivo existe y es ejecutable.
- Verdadero si el archivo existe y es un enlace simbólico.
Expresiones de cadena:
- Verdadero si la variable
varname
está definida (tiene un valor asignado). - Verdadero si la longitud de la cadena es cero.
- Verdadero si la longitud de la cadena no es cero.
- Verdadero si las cadenas son iguales.
- Se debe usar
=
con el comandotest
para la conformidad con POSIX. - Cuando se usa con el comando
[[
, esto realiza una coincidencia de patrones - como se describió anteriormente (Comandos compuestos).
- Verdadero si las cadenas no son iguales.
Devuelve verdadero si los números son iguales:
Devuelve verdadero si los números no son iguales:
Devuelve verdadero si arg1
es menor que arg2
:
Devuelve verdadero si arg1
es menor o igual a arg2
:
Devuelve verdadero si arg1
es mayor que arg2
:
Devuelve verdadero si arg1
es mayor o igual a arg2
:
Como nota al margen, arg1
y arg2
pueden ser enteros positivos o negativos.
Al igual que en otros lenguajes de programación, puedes usar condiciones AND
y OR
:
Condicionales en Bash
En la sección anterior, cubrimos algunas de las expresiones condicionales más populares. Ahora podemos usarlas con sentencias condicionales estándar como if
, if-else
y switch case
.
Sentencia If
El formato de una sentencia if
en Bash es el siguiente:
Aquí tienes un ejemplo rápido que te pedirá que ingreses tu nombre en caso de que lo hayas dejado vacío:
Sentencia If-Else
Con una sentencia if-else
, puedes especificar una acción en caso de que la condición de la sentencia if
no coincida. Podemos combinar esto con las expresiones condicionales de la sección anterior de la siguiente manera:
Puedes usar la sentencia if
anterior con todas las expresiones condicionales de los capítulos anteriores:
Aquí tienes otro ejemplo de una sentencia if
que verificaría tu ID de usuario actual y no permitiría ejecutar el script como el usuario root:
Si colocas esto al principio de tu script, saldrá si el EUID es 0 y no ejecutará el resto del script. Esto fue discutido en el foro de la comunidad de DigitalOcean.
Sentencias Switch-Case
Al igual que en otros lenguajes de programación, puedes usar una sentencia case
para simplificar condiciones complejas cuando hay múltiples opciones diferentes. Así, en lugar de usar varias sentencias if
y if-else
, podrías usar una sola sentencia case
.
La sintaxis de la sentencia case
en Bash es la siguiente:
Un resumen rápido de la estructura:
- Todas las sentencias
case
comienzan con la palabra clavecase
. - En la misma línea que la palabra clave
case
, debes especificar una variable o una expresión seguida de la palabra clavein
. - Después de eso, tienes tus patrones de
case
, donde debes usar)
para identificar el final del patrón. - Puedes especificar varios patrones divididos por una barra vertical
|
. - Después del patrón, especificas los comandos que te gustaría ejecutar en caso de que el patrón coincida con la variable o expresión que hayas especificado.
- Todas las cláusulas deben terminar con
;;
al final. - Puedes tener una sentencia por defecto agregando un
*
como patrón. - Para cerrar la sentencia
case
, usa la palabra claveesac
(que es "case" al revés).
Aquí tienes un ejemplo de una sentencia case
en Bash:
Con este script, le pedimos al usuario que ingrese el nombre de una marca de coches como Tesla, BMW, Mercedes, etc. Luego, con una sentencia case
, verificamos el nombre de la marca y si coincide con alguno de nuestros patrones, imprimimos la ubicación de la fábrica. Si el nombre de la marca no coincide con ninguno de nuestros patrones, imprimimos un mensaje por defecto: "marca de coche desconocida".
Conclusión
Te aconsejo que intentes modificar el script y jugar un poco con él para que puedas practicar lo que acabas de aprender en los dos últimos capítulos.
Para más ejemplos de sentencias case
en Bash, asegúrate de revisar el capítulo 16, donde crearemos un menú interactivo en Bash utilizando una sentencia case
para procesar la entrada del usuario.
Bucles en Bash
Al igual que en otros lenguajes, los bucles son muy convenientes. Con Bash puedes usar bucles for
, while
y until
.
Bucles For
Aquí tienes la estructura de un bucle for
:
Ejemplo:
Un resumen rápido del ejemplo:
- Primero, especificamos una lista de usuarios y almacenamos el valor en una variable llamada
$usuarios
. - Luego, comenzamos nuestro bucle
for
con la palabra clavefor
. - Después definimos una nueva variable que representará cada elemento de la lista que proporcionamos. En este caso, definimos una variable llamada
usuario
, que representará cada usuario de la variable$usuarios
. - Luego especificamos la palabra clave
in
seguida de nuestra lista a la que vamos a hacer el bucle. - En la siguiente línea, usamos la palabra clave
do
, que indica lo que haremos en cada iteración del bucle. - Finalmente, especificamos los comandos que queremos ejecutar.
- Terminamos el bucle con la palabra clave
done
.
También puedes usar el bucle for
para procesar una serie de números. Por ejemplo, aquí tienes una forma de hacer un bucle del 1 al 10:
Espero que la traducción te haya sido útil. Si tienes más preguntas o necesitas más aclaraciones, ¡no dudes en preguntar!
Bucles While
La estructura de un bucle while
es bastante similar a la del bucle for
:
Aquí tienes un ejemplo de un bucle while
:
Primero, especificamos una variable llamada counter
y la inicializamos en 1. Luego, dentro del bucle, incrementamos el contador utilizando esta instrucción: ((counter++))
. De esta manera, nos aseguramos de que el bucle se ejecute solo 10 veces y no se ejecute de manera indefinida. El bucle terminará tan pronto como el contador llegue a 10, ya que esa es la condición que hemos establecido: while [[ $counter -le 10 ]]
.
Vamos a crear un script que le pida al usuario su nombre y no permita una entrada vacía:
Ahora, si ejecutas lo anterior y solo presionas Enter sin proporcionar ninguna entrada, el bucle se ejecutará nuevamente y te pedirá tu nombre una y otra vez hasta que realmente ingreses algo.
Bucles Until
La diferencia entre los bucles until
y while
es que el bucle until
ejecutará los comandos dentro del bucle hasta que la condición se vuelva verdadera.
Estructura:
Ejemplo:
Continue y Break
Al igual que en otros lenguajes, puedes usar continue
y break
en tus scripts de Bash:
continue
le indica a tu script de Bash que detenga la iteración actual del bucle y comience la siguiente iteración.break
le indica a tu script de Bash que termine el bucle de inmediato.
Funciones en Bash
Las funciones son una excelente manera de reutilizar código. La estructura de una función en Bash es bastante similar a la de otros lenguajes:
También puedes omitir la palabra clave function
al principio, lo que también funcionará:
Personalmente prefiero incluirla por mejor legibilidad, pero es una cuestión de preferencia personal.
Ejemplo de una función que dice "¡Hola Mundo!":
Nota: Una cosa a tener en cuenta es que no debes agregar los paréntesis cuando llamas a la función.
Pasar argumentos a una función funciona de la misma manera que pasar argumentos a un script:
En los próximos capítulos estaremos usando funciones con bastante frecuencia.
Depuración, pruebas y atajos
Para depurar tus scripts de Bash, puedes usar -x
cuando ejecutes tus scripts:
O puedes agregar set -x
antes de la línea específica que deseas depurar. set -x
habilita un modo de la shell donde todos los comandos ejecutados se imprimen en el terminal.
Otra manera de probar tus scripts es usar esta fantástica herramienta:
Solo tienes que copiar y pegar tu código en el cuadro de texto, y la herramienta te dará algunas sugerencias sobre cómo puedes mejorar tu script.
También puedes ejecutar la herramienta directamente en tu terminal:
https://github.com/koalaman/shellcheck
Si te gusta la herramienta, asegúrate de darle una estrella en GitHub y contribuir.
Como SysAdmin/DevOps, paso gran parte de mi día en la terminal. Aquí tienes algunos de mis atajos favoritos que me ayudan a realizar tareas más rápido mientras escribo scripts de Bash o simplemente trabajo en la terminal.
Los dos siguientes son especialmente útiles si tienes un comando muy largo.
- Eliminar todo desde el cursor hasta el final de la línea:
Ctrl + k - Eliminar todo desde el cursor hasta el inicio de la línea:
Ctrl + u - Eliminar una palabra hacia atrás desde el cursor:
Ctrl + w - Buscar en tu historial hacia atrás. Probablemente este sea el que más uso. Es realmente útil y acelera mucho mi flujo de trabajo:
Ctrl + r - Limpiar la pantalla, uso este atajo en lugar de escribir el comando
clear
:
Ctrl + l - Detener la salida en pantalla:
Ctrl + s - Habilitar la salida en pantalla en caso de que haya sido detenida previamente con Ctrl + s:
Ctrl + q - Terminar el comando actual:
Ctrl + c - Enviar el comando actual al fondo:
Ctrl + z
Uso estos atajos regularmente todos los días, y me ahorran mucho tiempo.
Si crees que he omitido alguno, siéntete libre de unirte a la discusión en el foro de la comunidad de DigitalOcean.
Crear comandos personalizados de Bash
Como desarrollador o administrador de sistemas, es posible que tengas que pasar mucho tiempo en tu terminal. Siempre trato de buscar formas de optimizar las tareas repetitivas.
Una manera de hacerlo es escribir scripts de Bash cortos o crear comandos personalizados, también conocidos como alias. Por ejemplo, en lugar de escribir un comando muy largo cada vez, podrías crear un atajo para él.
Ejemplo
Empecemos con el siguiente escenario: como administrador de sistemas, es posible que tengas que revisar las conexiones a tu servidor web con bastante frecuencia. Usaré el comando netstat
como ejemplo.
Lo que normalmente haría cuando accedo a un servidor que está teniendo problemas con las conexiones a los puertos 80 o 443, es verificar si hay algún servicio escuchando en esos puertos y cuántas conexiones hay a esos puertos.
El siguiente comando de netstat
nos mostraría cuántas conexiones TCP tenemos actualmente en los puertos 80 y 443:
Este es un comando bastante largo, por lo que escribirlo cada vez podría ser una pérdida de tiempo, especialmente cuando quieres obtener esa información rápidamente.
Para evitarlo, podemos crear un alias, para que en lugar de escribir todo el comando, solo tengamos que escribir un comando corto. Por ejemplo, supongamos que queremos poder escribir conn
(abreviatura de connections) y obtener la misma información. Todo lo que necesitamos hacer en este caso es ejecutar el siguiente comando:
De esta manera, estamos creando un alias llamado conn
, que esencialmente sería un "acceso directo" para nuestro largo comando de netstat
. Ahora, si ejecutas solo conn
:
Espero que la traducción te sea útil. Si tienes más preguntas o necesitas más detalles, ¡no dudes en preguntar!
Obtendrás la misma salida que con el comando largo de netstat
. Puedes ser aún más creativo y agregar algunos mensajes informativos como este:
Ahora, si ejecutas conn
, obtendrás la siguiente salida:
Ahora, si cierras sesión y vuelves a iniciar sesión, tu alias se perderá. En el siguiente paso verás cómo hacer que este cambio sea persistente.
Hacer el cambio persistente
Para hacer que el cambio sea persistente, necesitamos agregar el comando alias
en nuestro archivo de perfil de la shell.
Por defecto, en Ubuntu este archivo sería ~/.bashrc
, y para otros sistemas operativos podría ser ~/.bash_profile
. Abre el archivo con tu editor de texto favorito:
Ve al final del archivo y agrega lo siguiente:
Guarda y luego cierra el archivo.
De esta manera, ahora, incluso si cierras sesión y vuelves a iniciar sesión, tu cambio se mantendrá y podrás ejecutar tu comando personalizado de Bash.
Listar todos los alias disponibles
Para listar todos los alias disponibles para tu shell actual, solo tienes que ejecutar el siguiente comando:
Esto es útil en caso de que estés viendo un comportamiento extraño con algunos comandos.
Conclusión
Esta es una forma de crear comandos personalizados de Bash o alias de Bash.
Por supuesto, también podrías escribir un script de Bash y agregarlo en la carpeta /usr/bin
, pero esto no funcionaría si no tienes acceso de root o sudo, mientras que con los alias puedes hacerlo sin necesidad de acceso root.
Nota: Esto fue publicado inicialmente en DevDojo.com.
Escribir tu primer script en Bash
¡Vamos a intentar juntar todo lo que hemos aprendido hasta ahora y crear nuestro primer script en Bash!
Planificación del script
Como ejemplo, escribiremos un script que obtendrá información útil sobre nuestro servidor, como:
- Uso actual del disco
- Uso actual de la CPU
- Uso actual de la memoria RAM
- Verificación de la versión exacta del Kernel
Siéntete libre de ajustar el script agregando o eliminando funcionalidades para que se adapte a tus necesidades.
Escribiendo el script
Lo primero que debes hacer es crear un nuevo archivo con la extensión .sh
. Yo crearé un archivo llamado status.sh
, ya que el script que vamos a crear nos dará el estado de nuestro servidor.
Una vez que hayas creado el archivo, ábrelo con tu editor de texto favorito.
Como aprendimos en el capítulo 1, en la primera línea de nuestro script de Bash debemos especificar lo que se llama el Shebang:
Lo único que hace el shebang es instruir al sistema operativo para que ejecute el script con el ejecutable /bin/bash
.
Agregar comentarios
A continuación, como se discutió en el capítulo 6, comencemos agregando algunos comentarios para que las personas puedan entender fácilmente para qué sirve el script. Para hacer esto, simplemente agrega lo siguiente después del shebang:
Agregar tu primera variable
Ahora vamos a aplicar lo que aprendimos en el capítulo 4 y agregar algunas variables que podríamos querer usar a lo largo del script.
Para asignar un valor a una variable en Bash, solo tienes que usar el signo =
.
Por ejemplo, vamos a almacenar el nombre del host de nuestro servidor en una variable para que podamos usarla más tarde:
Al usar $()
le decimos a Bash que interprete el comando y luego asigne el valor a nuestra variable.
Ahora, si imprimimos la variable con echo
, veremos el nombre de host actual:
Agregar tu primera función
Como ya sabes después de leer el capítulo 12, para crear una función en Bash necesitas usar la siguiente estructura:
Vamos a crear una función que devuelva el uso actual de la memoria en nuestro servidor:
Explicación rápida de la función:
function memory_check() {
- así definimos la función.echo ""
- aquí solo imprimimos una nueva línea.echo "El uso actual de la memoria en ${server_name} es: "
- aquí imprimimos un pequeño mensaje y la variable$server_name
.}
- finalmente, así cerramos la función.
Una vez que se ha definido la función, para llamarla, simplemente usa el nombre de la función:
Desafío: Agregar más funciones
Antes de ver la solución, te desafío a usar la función que hemos creado anteriormente y escribir algunas funciones por ti mismo.
Las funciones deben hacer lo siguiente:
- Uso actual del disco
- Uso actual de la CPU
- Uso actual de la memoria RAM
- Verificar la versión exacta del Kernel
Si no sabes qué comandos necesitas usar para obtener esa información, siéntete libre de buscar en Google.
Una vez que estés listo, puedes desplazarte hacia abajo y ver cómo lo hicimos y comparar los resultados.
Ten en cuenta que hay múltiples formas correctas de hacerlo.
El script de ejemplo
Así es como quedaría el resultado final:
¡Y ahí lo tienes! Ahora tienes un script que devuelve el estado actual del servidor.
Si tienes más preguntas o necesitas más ayuda, no dudes en preguntar. ¡Feliz codificación!
Conclusión
¡Los scripts en Bash son geniales! No importa si eres un ingeniero DevOps/SysOps, un desarrollador o simplemente un entusiasta de Linux, puedes usar scripts de Bash para combinar diferentes comandos de Linux y automatizar tareas diarias aburridas y repetitivas, ¡para que puedas concentrarte en cosas más productivas y divertidas!
Nota: Esto fue publicado inicialmente en DevDojo.com.
Crear un menú interactivo en Bash
En este tutorial, te mostraré cómo crear un menú de selección múltiple en Bash, para que tus usuarios puedan elegir qué acción ejecutar.
Reutilizaremos parte del código del capítulo anterior, así que, si aún no lo has leído, asegúrate de hacerlo.
Planificando la funcionalidad
Comencemos de nuevo repasando la funcionalidad principal del script:
- Verifica el uso actual del disco
- Verifica el uso actual de la CPU
- Verifica el uso actual de la memoria RAM
- Verifica la versión exacta del Kernel
En caso de que no lo tengas a mano, aquí está el script:
Luego, construiremos un menú que permita al usuario elegir qué función ejecutar.
Por supuesto, puedes ajustar las funciones o agregar nuevas según tus necesidades.
Agregando algunos colores
Para hacer que el menú sea un poco más 'legible' y fácil de entender a primera vista, agregaremos algunas funciones de color.
Al principio de tu script, agrega las siguientes funciones de color:
Puedes usar las funciones de color de la siguiente manera:
El resultado será que el texto "Texto aquí" se mostrará en azul.
Agregando el menú
Finalmente, para agregar nuestro menú, crearemos una función separada con un switch case para las opciones del menú:
Explicación rápida del código
Primero, simplemente mostramos las opciones del menú con algo de color:
Luego, leemos la respuesta del usuario y la almacenamos en una variable llamada $a
:
Finalmente, tenemos un switch case que ejecuta una función diferente dependiendo del valor de $a
:
Al final, necesitamos llamar a la función del menú para imprimir realmente el menú:
Probando el script
Al final, tu script debería verse así:
Para probar el script, crea un nuevo archivo con extensión .sh
, por ejemplo: menu.sh
y luego ejecútalo:
La salida que recibirás será algo como esto:
Podrás elegir una opción diferente de la lista y cada número llamará a una función distinta del script.
¡Y eso es todo! Ahora tienes un menú interactivo en Bash que te permite elegir qué información ver de tu sistema. ¡Feliz programación!
¡Ahora sabes cómo crear un menú en Bash e implementarlo en tus scripts para que los usuarios puedan seleccionar diferentes opciones!
Nota: Este contenido fue publicado inicialmente en DevDojo.com.
Ejecutando scripts de BASH en múltiples servidores remotos
Cualquier comando que puedas ejecutar desde la línea de comandos puede ser usado en un script de Bash. Los scripts se utilizan para ejecutar una serie de comandos. Bash está disponible por defecto en los sistemas operativos Linux y macOS.
Imaginemos un escenario hipotético en el que necesitas ejecutar un script de BASH en varios servidores remotos, pero no quieres copiar manualmente el script a cada servidor, luego iniciar sesión en cada servidor de forma individual y solo entonces ejecutar el script.
Por supuesto, podrías usar una herramienta como Ansible, pero ¡vamos a aprender cómo hacerlo con Bash!
Requisitos previos
Para este ejemplo, usaré 3 servidores remotos con Ubuntu desplegados en DigitalOcean. Si aún no tienes una cuenta en DigitalOcean, puedes registrarte y obtener $100 de crédito gratuito a través de este enlace de referido:
https://m.do.co/c/2a9bba940f39
Una vez que tengas tu cuenta de DigitalOcean lista, adelante, despliega 3 "droplets" (servidores).
Yo ya he creado 3 servidores Ubuntu:
Si eres nuevo en DigitalOcean, puedes seguir los pasos para crear un Droplet aquí:
Cómo crear un Droplet desde el panel de control de DigitalOcean
También puedes seguir los pasos de este video sobre cómo hacer la configuración inicial de tu servidor:
Cómo hacer la configuración inicial del servidor con Ubuntu
O mejor aún, puedes seguir este artículo sobre cómo automatizar la configuración inicial del servidor con Bash:
Automatizando la configuración inicial del servidor con Ubuntu 18.04 usando Bash
Con los 3 nuevos servidores en marcha, ¡ya podemos centrarnos en ejecutar nuestro script de Bash en todos ellos con un solo comando!
El Script de BASH
Voy a reutilizar el script de demostración del capítulo anterior con algunos pequeños cambios. Simplemente ejecuta una serie de comprobaciones como el uso actual de memoria, el uso actual de la CPU, el número de conexiones TCP y la versión del kernel.
Copia el código de abajo y guárdalo en un archivo llamado remote_check.sh. También puedes obtener el script desde aquí.
Ejecutando el Script en todos los Servidores
Ahora que tenemos el script y los servidores listos, y hemos agregado esos servidores en nuestro archivo servers.txt, podemos ejecutar el siguiente comando para hacer un bucle a través de todos los servidores y ejecutar el script remotamente, sin tener que copiar el script a cada servidor ni conectarnos a cada uno individualmente:
Lo que hace este bucle for es recorrer cada servidor en el archivo servers.txt y luego ejecutar el siguiente comando para cada servidor en la lista:
Obtendrás el siguiente resultado:
Este es solo un ejemplo muy simple de cómo ejecutar un script sencillo en múltiples servidores sin tener que copiar el script a cada servidor y sin tener que acceder a cada servidor individualmente.
Por supuesto, podrías ejecutar un script mucho más complejo y en muchos más servidores.
Si estás interesado en la automatización, te recomendaría revisar la página de recursos de Ansible en el sitio web de DigitalOcean:
Recursos de Ansible
Aviso: Este contenido fue publicado originalmente en DevDojo.
Trabajando con JSON en BASH usando jq
La herramienta de línea de comandos jq es un procesador de JSON ligero y flexible. Es excelente para analizar la salida JSON en BASH.
Una de las grandes ventajas de jq es que está escrito en C portátil, y no tiene dependencias en tiempo de ejecución. Todo lo que necesitas hacer es descargar un único binario o usar un gestor de paquetes como apt para instalarlo con un solo comando.
Planificación del script
Para la demostración en este tutorial, utilizaré una API REST externa que devuelve una salida JSON simple llamada QuizAPI:
https://quizapi.io/
Si deseas seguir este tutorial, asegúrate de obtener una clave API gratuita aquí:
https://quizapi.io/clientarea/settings/token
QuizAPI es gratuita para desarrolladores.
Instalando jq
Existen muchas formas de instalar jq en tu sistema. Una de las maneras más directas de hacerlo es usar el gestor de paquetes según tu sistema operativo.
Aquí tienes una lista de los comandos que necesitas usar dependiendo de tu sistema operativo:
Instalar jq en Ubuntu/Debian:
Instalar jq en Fedora:
Instalar jq en openSUSE:
Instalar jq en Arch:
Instalar en Mac con Homebrew:
Instalar en Mac con MacPorts:
Si usas otro sistema operativo, te recomiendo revisar la documentación oficial aquí para más detalles:
https://stedolan.github.io/jq/download/
Una vez que hayas instalado jq, puedes verificar tu versión actual ejecutando este comando:
Analizando JSON con jq
Una vez que tengas instalado jq y tu API Key de QuizAPI, puedes analizar la salida JSON de QuizAPI directamente en tu terminal.
Primero, crea una variable que almacene tu clave API:
Para obtener alguna salida de uno de los endpoints de QuizAPI, puedes usar el comando curl:
Para obtener una salida más específica, puedes usar el Generador de URL de QuizAPI aquí:
https://quizapi.io/api-config
Después de ejecutar el comando curl, la salida que obtendrás será algo como esto:
Observa el | jq
al final.
En este caso, la salida que obtendrás será algo como esto:
¡La herramienta de línea de comandos jq
formateó la salida por nosotros y agregó algunos colores bonitos!
Obteniendo el primer elemento con jq
Supongamos que solo queremos obtener el primer elemento de la salida JSON. Para hacer eso, solo tenemos que especificar el índice que queremos ver con la siguiente sintaxis:
Ahora, si ejecutamos nuevamente el comando curl
y pasamos la salida a jq .[0]
de esta forma:
Solo obtendrás el primer elemento, y la salida se verá algo así:
A veces puede que quieras obtener solo el valor de una clave específica. Supongamos que, en nuestro ejemplo, la QuizAPI devuelve una lista de preguntas junto con las respuestas, la descripción, etc. Pero ¿qué pasa si solo quieres obtener las preguntas sin la información adicional?
Esto es bastante sencillo con jq
. Todo lo que necesitas hacer es agregar la clave después del comando jq
, y se vería algo como esto:
Tenemos que agregar el .[ ]
porque la QuizAPI devuelve un arreglo, y al especificar .[ ]
, le decimos a jq
que queremos obtener el valor .question
para todos los elementos del arreglo.
La salida que obtendrás se verá algo así:
Vamos a crear un pequeño script en Bash que debe mostrar la siguiente información para nosotros:
- Obtener solo la primera pregunta del resultado.
- Obtener todas las respuestas para esa pregunta.
- Asignar las respuestas a variables.
- Imprimir la pregunta y las respuestas.
Para hacer esto, he preparado el siguiente script:
Nota: Asegúrate de reemplazar API_KEY
por tu clave real de QuizAPI.
Si ejecutas el script, deberías obtener una salida similar a esta:
Este script obtiene la primera pregunta de la API, extrae sus respuestas y las imprime en un formato limpio y legible.
En resumen, la automatización de la protección contra DDoS de Cloudflare usando un script Bash es bastante sencilla, aunque depende de que el servidor siga respondiendo. Si estás buscando algo más avanzado, puedes integrar el monitoreo para hacer que el script sea activado basado en estadísticas de sistemas de monitoreo como Nagios.
Trabajando con la API de Cloudflare con Bash
Yo alojo todos mis sitios web en DigitalOcean Droplets y también uso Cloudflare como mi proveedor de CDN. Una de las ventajas de usar Cloudflare es que reduce el tráfico general a tu usuario y también oculta la dirección IP de tu servidor detrás de su CDN.
Mi característica favorita de Cloudflare es su protección gratuita contra DDoS. Me ha salvado de ataques DDoS en múltiples ocasiones. Cloudflare tiene una API muy útil para habilitar o deshabilitar fácilmente la protección contra DDoS. En este capítulo, te reto a escribir un script Bash que habilite y desactive la protección contra DDoS de Cloudflare automáticamente cuando sea necesario.
Requisitos previos
Antes de seguir este tutorial, asegúrate de tener tu cuenta de Cloudflare configurada y tu sitio web listo. Si no estás seguro de cómo hacerlo, puedes seguir los pasos aquí:
- Crear una cuenta de Cloudflare y agregar un sitio web.
Una vez que tengas tu cuenta de Cloudflare, asegúrate de obtener la siguiente información:- Una cuenta de Cloudflare
- La clave API de Cloudflare
- El Zone ID de Cloudflare
También asegúrate de que curl
esté instalado en tu servidor ejecutando:
Si no tienes curl
, instálalo dependiendo de tu distribución:
- Para RedHat/CentOS:
- Para Debian/Ubuntu:
Desafío - Requisitos del script
El script debe monitorear el uso de CPU en tu servidor y, si el uso de la CPU aumenta mucho, basándose en el número de vCPU, debería activar automáticamente la protección contra DDoS en Cloudflare mediante su API. Las principales características del script deberían ser:
- Verificar la carga de CPU en el servidor.
- En caso de un aumento de la carga de CPU, el script debería hacer una llamada a la API de Cloudflare y activar la protección contra DDoS para la zona especificada.
- Después de que la carga de CPU vuelva a la normalidad, el script desactivará la opción de "Estoy bajo ataque" y la restaurará a su estado normal.
Ejemplo de script
Ya he preparado un script de demostración que puedes usar como referencia. Pero te animo a intentar escribir el script por ti mismo primero, y solo luego mirar mi solución.
Para descargar el script, puedes ejecutar el siguiente comando:
Abre el script con tu editor de texto favorito:
Y actualiza los siguientes detalles con tu información de Cloudflare:
Después de eso, haz que el script sea ejecutable:
Finalmente, configura 2 trabajos de cron para que se ejecuten cada 30 segundos. Para editar tu crontab, ejecuta:
Y agrega el siguiente contenido:
Ten en cuenta que debes cambiar la ruta al script por la ruta real donde has almacenado el script.
Conclusión
Esta solución es bastante directa y asequible, aunque una de las desventajas es que si tu servidor se vuelve no responsable debido a un ataque, el script podría no ejecutarse.
Por supuesto, una mejor solución sería utilizar un sistema de monitoreo como Nagios, basado en las estadísticas del sistema de monitoreo para ejecutar el script, pero este desafío puede ser una buena experiencia de aprendizaje.
Resumen de los logs de acceso de NGINX y Apache con un script BASH
Una de las primeras cosas que haría si noto un uso elevado de CPU en alguno de mis servidores Linux sería revisar la lista de procesos con top
o htop
, y si noto que hay muchos procesos de Apache o NGINX, rápidamente revisaría los logs de acceso para determinar qué ha causado o está causando el pico de CPU o si hay algo malicioso.
Leer los logs puede ser intimidante, ya que el archivo de log puede ser enorme, y revisarlo manualmente puede llevar mucho tiempo. Además, el formato de log sin procesar puede resultar confuso para quienes tienen menos experiencia.
Requisitos del script
Este script BASH necesita analizar y resumir tus logs de acceso y proporcionarte información útil como:
- Las 20 páginas principales con más solicitudes POST.
- Las 20 páginas principales con más solicitudes GET.
- Las 20 principales direcciones IP y su geolocalización.
Ejemplo de script
He preparado un script de demostración que puedes usar como referencia. Pero te animo a intentar escribir el script por ti mismo primero. Para descargar el script, puedes ejecutar:
O también puedes ejecutar el siguiente comando para descargar el script en tu directorio actual:
El script solo lee el contenido de tu archivo de log y lo resume para ti. Después de descargar el archivo, asegúrate de revisar su contenido por ti mismo.
Ejecutando el script
Una vez que hayas descargado el script, hazlo ejecutable con el siguiente comando:
Luego, ejecuta el script con:
Asegúrate de cambiar la ruta al archivo de log con la ruta real a tu archivo de acceso. Por ejemplo, si estás usando Apache en un servidor Ubuntu, el comando exacto sería:
Si usas NGINX, el comando sería casi el mismo, pero con la ruta al log de acceso de NGINX:
Entendiendo la salida
Cuando ejecutes el script, puede tardar un poco dependiendo del tamaño de los logs. La salida que deberías ver tendrá un formato similar a este:
Este enfoque te permitirá obtener un resumen claro y detallado de tus logs de acceso sin la necesidad de herramientas adicionales.
No hay comentarios.:
Publicar un comentario