BASH: El lenguaje de scripting que todo desarrollador debe conocer
Si quieres ser un desarrollador bueno debes sentirte cómodo trabajando en la consola. Aprende BASH 🐿️✌️

BASH es una abreviatura de "Bourne Again SHell", es un lenguaje de scripting que permite la automatización de tareas y la creación de secuencias de comandos para realizar diversas operaciones en el sistema. Como todo lenguaje de scripting, este se usa mediante una interfaz de línea de comandos más conocida por sus siglas CLI o también llamada consola.

Es comúnmente utilizado en sistemas operativos basados en Unix y Linux. También puede usarse en Windows mediante WSL (Windows subsystem for Linux). Es una mejora del shell original de Unix, conocido como "Bourne shell" (sh), desarrollado por Stephen Bourne.

Porqué es importante BASH

  • Administración de servidores: No es ningún secreto que la vasta mayoría de servidores corren Linux por lo tanto tienen a BASH como su intérprete de comandos por defecto, así que conocer este lenguaje de scripting supone una ventaja muy grande para administrar y mantener servidores. ATENCIÓN: No pienses "como no soy sysadmin entonces esto no me compete", como desarrollador deberás saber como publicar tu aplicación, y ahora más que nunca, entonces deberás estar familiarizado con sistemas basados en Unix/Linux, y si eres DevOps con mucha más razón 👨‍💻.
  • Secuencia de comandos: Los desarrolladores de software en algún momento necesitarán escribir secuencia de comandos para hacer tareas específicas en el sistema operativo, conocer BASH te permite todo esto.
  • Manejar herramientas: Bash se integra con otras herramientas de automatización y desarrollo como Docker, Git, entre otras, así que conocer BASH ayuda mucho en el manejo de herramientas de desarrollo y uno como desarrollador debe sentirse familiarizado con la consola.
  • Automatización: Con BASH puedes automatizar tareas repetitivas del sistema como gestión de archivos, ejecutar procesos, configurar entornos de desarrollo, etc.

Estar familiarizado en Bash mejora la productividad y la eficiencia de los desarrolladores en una variedad de entornos de desarrollo y operaciones, así que conviene aprenderlo y estar cómodo con él.

Hay más lenguajes de scripting también muy utilizados como Batch o PowerShell, ambos diseñados para Windows. Si bien algunos comandos son similares, no son lo mismo.

Comandos generales básicos

Estos comandos nos permiten obtener información o hacer operaciones en el sistema:

Información del sistema operativo: lsb_release -a ó cat /etc/os-release

Ver el nombre del host del sistema: hostname

Apagar el sistema: shutdown -h now ó shutdown -h +5 para apagarlo en 5 minutos

Reiniciar el sistema: reboot

Ver procesos activos: ps aux

Matar un proceso: kill [PID] (el # del proceso o PID lo obtenemos con el comando anterior).

Ver características de hardware: lshw y sólo de cpu: lscpu

Ver memoria libre: free -h

Ver espacio en disco libre: df -h

Ver puertos abiertos: netstat -tuln

Limpiar consola: clear

Correr proceso en segundo plano: nohup dotnet myApi.dll > salida.log s>&1 &

Con el comando anterior corremos nuestra API y la dejamos en segundo plano. Para terminar su ejecución podemos ejecutar los comandos citados arriba para ver y matar procesos.

Para ver la velocidad de tu conexión: Necesitarás instalar un paquete apt-install speedtest-cli y luego ejecutar: speedtest-cli

Ver lista de comandos ejecutados previamente en la sesión actual: history

Cambiar el usuario actual a superusuario (root): sudo su

Salir de la sesión actual (si ejecutaste sudo su volverías a tu sesión anterior, sino te desconectará la sesión actual): exit

Ver información en tiempo real sobre procesos del sistema, CPU, memoria y recursos: top

Una vez ejecutado top, para salir pulsar la tecla Q ó CTRL + C

Aquí te muestro algunos de estos comandos siendo ejecutados mediante una conexión mediante el protocolo SSH hacia un servidor remoto:

Así masomenos luce la consola tras ejecutar el comando top:

Usuarios y permisos

Para ejecutar estos comando debes tener privilegios de superusuario, o debes añadir sudo antes de los comandos.

Cambiar la contraseña del usuario root: passwd root

Si no tienes permisos de superusuario obtienes un warning, sin embargo cuando tienes los permisos o añades sudo sí te deja:

Crear usuario 'cpanel': adduser cpanel

Añadir al usuario al grupo sudo (dar privilegios de superusuario): usermod -aG sudo cpanel

Añadir al usuario al grupo users: usermod -g users cpanel

Habilitar/deshabilitar login como root: sudo nano /etc/ssh/sshd_config y setear yes/no en PermitRootLogin.

Obtener información del usuario 'cpanel': id cpanel

Trabajando con archivos y directorios

Los comandos para trabajar con archivos y directorios son también muy utilizados, aquí te listo los que como desarrollador debes conocer sí o sí.

Mostrar ruta actual: pwd

Crear carpeta 'directorio': mkdir directorio

Renombrar carpeta 'directorio' a 'folder': mv directorio folder

Renombrar carpeta 'directorio' a 'mi folder': mv directorio 'mi folder'

Ir al directorio raíz: cd /

El directorio raíz es el directorio principal de un sistema de archivos. En macOS y Linux sería "/", en Windows es C:/ en caso que el sistema operativo haya sido instalado en esa unidad de disco.

Moverse al directorio 'Test': cd Test

Listar archivos y carpetas: ls ó ls -a (para ver todos incluído ocultos) ó ls -lh (muestra más información de las carpetas como el tamaño en formato legible)

Crear o editar el archivo 'test.txt': nano test.txt

Mostrar contenido del archivo 'test.txt': cat test.txt

Reemplazar el contenido de un archivo con el contenido de otro: cat origen.txt > destino.txt

Imprimir 'Hola mundo!' en consola: echo 'Hola mundo!'

Eliminar el archivo 'test.txt': rm test.txt

Eliminar la carpeta 'directorio': rm -rf directorio

Crear el archivo 'test.txt': touch test.txt

Para reemplazar el contenido del archivo 'test.txt' con el texto 'hola mundo' ejecutar: echo 'hola mundo' > test.txt Este comando reemplaza todo el contenido del archivo.

En cambio con: echo 'hola mundo' >> test.txt este comando no borra el contenido existente, sino que añade 'hola mundo' al final.

Agrupar archivos o directorios

En Bash puedes agrupar archivos o directorios con tar, esto no los comprime, sólo los agrupa. Aquí unos ejemplos:

Añadir sqlassist.exe, tareas.txt y el directorio test en un sólo archivo llamado myfirsttar.tar: tar -cvf myfirsttar.tar sqlassist.exe tareas.txt test/

Listar el contenido de myfirsttar.tar: tar -tvf myfirsttar.tar

Extraer el contenido de myfirsttar.tar: tar -xvf myfirsttar.tar

Copiar o mover archivos

Copiar archivo.txt en el directorio midirectorio: cp archivo.txt midirectorio/

Copiar archivo.txt en el directorio midirectorio y renombrarlo a apuntes.txt: cp archivo.txt midirectorio/apuntes.txt

Copiar el directorio pendientes y todo su contenido en completados: cp -r pendientes/ completados/

Retroceder un nivel arriba del directorio actual cp archivo.txt midirectorio/

Si quieres copiar archivo.txt al directorio raíz: cp archivo.txt /

Duplicar archivo.txt en el mismo directorio con el nombre de backup.txt: cp archivo.txt backup.txt

Duplicar directorio documentos con el nombre de documentosbackup: cp -r documentos/ documentosbackup/

Renombrar foto.jpg a retrato.jpg: mv foto.jpg retrato.jpg

Mover foto.jpg al directorio fotos/foto.jpg: mv foto.jpg fotos/

Mover foto.jpg al directorio fotos y renombrar como fotografia.jpg: mv foto.jpg fotos/fotografia.jpg

Mover directorio fotos dentro de misfotos: mv fotos/ misfotos/

Búsqueda de texto

Buscar "comando" en todos los archivos del directorio actual y subdirectorios: grep -rn "comando" ./

Subir/Descargar archivos

Enviar archivo.zip al directorio /home/usuario/ de tu servidor mediante el protocolo ssh: scp D:\archivo.zip root@192.18.0.1:/home/usuario/

Descargar archivo.zip ubicado en /home/usuario/ en tu servidor hacia tu máquina local en el directorio actual mediante el protocolo ssh: scp root@192.18.0.1:/home/usuario/archivo.zip .

Estos dos últimos comandos para cargar o descargar archivos desde o hacia tu máquina local, se ejecutan en tu máquina local, ya sea con la consola en Unix/Linux o PowerShell en Windows. Deberás reemplazar el usuario de tu servidor, en el ejemplo uso root, también deberás poner la IP de tu servidor y las rutas correctas.

Archivos comprimidos

Una de las herramientas de compresión de archivos más común es gzip, aunque también puedes usar zip o rar como verás.

Comprimir el archivo 'archivo.txt': gzip archivo.txt

Descomprimir el archivo 'archivo.zip': gunzip archivo.txt.gz

Instalar 'Unzip': apt install unzip

Descomprimir el archivo 'archivo.zip': unzip archivo.zip

Instalar 'Unrar': apt install unrar

Descomprimir el archivo 'archivo.rar' : unrar x archivo.rar

En ambos casos citados creará una carpeta con el mismo nombre que el archivo en el directorio actual

Aquí he ejecutado alguno de estos comandos BASH utilizando el programa llamado Git Bash.

Comandos avanzados: Firewall

Saber al menos lo básico de firewalls en Linux, es muy importante para reducir el riesgo de caer en algún ataque informático. En sistemas basados en Linux existen dos herramientas que son las más utilizadas para administrar el firewall en el sistema: iptables y ufw.

iptables tiene una curva de aprendizaje más pronunciada y po eso te permite configurar a un nivel más avanzado y detallado tu firewall.

Por otra parte ufw viene de "uncomplicated firewall" es más sencillo y fácil de aprender y es más que suficiente en la mayoría de los casos para un desarrollador que quiere administrar su servidor Linux y protegerlo mediante un firewall.

A continuación te dejo los comandos más importantes:

Instalar ufw (si es que aún no está instalado): apt install ufw

Verificar estado de ufw: ufw status numbered

Borrar regla de ufw: ufw delete [numero de regla]

Habilitar ufw: ufw enable

Deshabilitar ufw: ufw disable

Abrir el puerto 7000: ufw allow 7000/tcp

Abrir el puerto que utiliza ssh (el puerto es el 22): ufw allow 22/tcp ó ufw allow ssh

Abrir un rango de puertos: ufw allow [puerto inicial]:[puerto final]/tcp

Recargar la configuración del firewal: ufw reload

Resetear la configuración del firewal: ufw reset

Permitir tráfico entrante desde una IP específica: ufw allow from [direccion IP]

Bloquear tráfico entrante y saliente en un puerto específico: ufw deny [puerto]

Si esta entrada te ha gustado, compártela! 🐿️✌️

Créditos de la imagen de portada: Foto de Markus Spiske en Unsplash

2 comentarios en «BASH: El lenguaje de scripting que todo desarrollador debe conocer»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *