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»