Tabla de contenido
Una vez más aquí. Hoy vengo a dejar otro pequeño script relacionado con bash. El viernes, un compañero me preguntó si en este script que pasamos parte de la mana haciendo, había encriptado las contraseñas de este script en bash para crear un login básico. Y después de pensarlo un poco, y mientras espero que se termine de mover cierta información, pues me he puesto a rehacer aquel script (según recuerdo era un login básico en bash) y añadir una encriptación de contraseña (por probar). Y una vez terminado, aquí lo dejo por si a alguien le puede servir.
En el mundo de la administración de sistemas y programación de scripts, Bash (Bourne Again Shell) se destaca como un lenguaje poderoso y versátil. Yo creo que un ejemplo que todos aquellos que estudian un poco este lenguaje, terminan creando en algún momento mediante un Script en bash, es el crear un login Por eso, en este artículo vamos a ver el funcionamiento de dicho script, que posiblemente no estará completo, pero es todo lo que recuerdo de lo que nos pidieron.
Requisitos del script
- Hacer un login en bash que permita al usuario escribir el nombre de usuario y la contraseña asociada a este nombre.
- Los datos de logueo se deben guardar dentro de un archivo llamado loginusuarios.txt.
- Si el usuario no existe en el archivo, el programa debe dar la posibilidad de crear al usuario con su correspondiente contraseña.
- Cuando el usuario haga login, en caso de que la contraseña no sea correcta, el programa devolverá un error. Solo debe permitir 3 intentos de login cuando el usuario falla con la contraseña. Esta parte solo se mostrará en el menú interactivo.
- Estos intentos de login deben mostrarse en pantalla con un mensaje que diga «Te quedan x intentos». Esta parte solo se mostrará en el menú interactivo.
- También daremos la posibilidad de que un usuario pueda eliminar su cuenta de usuario utilizando su nombre de usuario y su contraseña.
- Las contraseñas se deben encriptar en el archivo de texto.
- Si no se pasan parámetros desde la terminal, se mostrará un menú para loguearse, crear al usuario o eliminar la cuenta.
- Si el usuario existe, debe aparecer un mensaje que diga «Hola, estás logueado como … y el nombre de usuario». También he añadido la fecha y la hora del sistema.
- También debe de permitir el script enviar los datos de logueo desde la terminal como parámetros al script, donde se realizarán las comprobaciones descritas.
- Además se debe crear una sección de ayuda para mostrar los parámetros que se pueden utilizar desde la terminal
Un vistazo rápido a este script en bash
La primera parte del script se dedica al proceso de inicio de sesión. Los usuarios tienen la opción de proporcionar su nombre de usuario y contraseña, que luego son verificados por el script. Si el usuario no está registrado, se le da la oportunidad de crear una cuenta escribiendo un nuevo nombre de usuario y una contraseña. Este proceso se asegura de que las contraseñas se encripten utilizando el algoritmo AES-256 y PBKDF2 para mejorar la seguridad.
Estructura Modular y Menú Interactivo

Una característica notable de este script es su enfoque modular. Las funciones se utilizan para manejar diferentes tareas, desde encriptar contraseñas hasta verificar la existencia de usuarios. Además, el script ofrece un menú interactivo que permite a los usuarios elegir entre opciones como iniciar sesión, crear una cuenta o eliminar su cuenta existente. Esta estructura modular y el menú interactivo aumentan la flexibilidad y la usabilidad del script.
Manejo desde la terminal

Este script se puede utilizar como he mencionado desde un menú interactivo, pero además también permitirá a los usuarios realizar las mismas operaciones pasando argumentos desde la terminal. Además, el script incluye una sección de ayuda que enumera las opciones y argumentos que los usuarios pueden utilizar desde la línea de comandos para interactuar con el script.
Manejo de Errores y Limitación de Intentos de Inicio de Sesión
El script también aborda la gestión de errores y seguridad. Si un usuario escribe una contraseña incorrecta durante el inicio de sesión, el script ofrece hasta tres intentos antes de devolverlo al menú de inicio. Este enfoque protege contra ataques de fuerza bruta mientras brinda a los usuarios una oportunidad para corregir sus errores.
Eliminación de Cuentas y Ayuda
Otra función es la capacidad de los usuarios para eliminar sus propias cuentas. Al proporcionar su nombre de usuario y contraseña, pueden confirmar su intención de eliminar la cuenta.
Código del Script en bash para crear un sistema de login
#!/bin/bash # Archivo para login de usuarios ARCHIVO_LOGIN="loginusuarios.txt" # PBKDF2_SALT para ser utilizado como salt para la función PBKDF2 PBKDF2_SALT="entreunosyceros.net" # Función para encriptar un password encriptar_password() { # Utiliza OpenSSL para encriptar la contraseña: # - Se toma la contraseña proporcionada como argumento ($1). # - Se utiliza el algoritmo AES-256 en modo CBC para encriptar. # - Se aplica el algoritmo de derivación de clave PBKDF2 usando el salt definido. # - El resultado encriptado se codifica en base64 para que sea legible. password_encriptado=$(echo "$1" | openssl enc -aes-256-cbc -a -salt -pbkdf2 -pass pass:$PBKDF2_SALT) echo "$password_encriptado" # Devuelve la contraseña encriptada } # Función para desencriptar un password desencriptar_password() { # Se añade la opción -d para desencriptar password_desencriptado=$(echo "$1" | openssl enc -aes-256-cbc -a -d -salt -pbkdf2 -pass pass:$PBKDF2_SALT) echo "$password_desencriptado" } # Función para mostrar la cabecera cabecera() { clear echo "" echo "====================================" echo " Opción | $1 " echo "====================================" echo "" } # Crear el archivo en el que guardar los usuarios si no existe if [ ! -f "$ARCHIVO_LOGIN" ]; then touch "$ARCHIVO_LOGIN" fi # Función para mostrar la ayuda ayuda() { echo "=============================================================" echo "Uso: $0 [opciones]" echo "-------------------------------------------------------------" echo "Opciones:" echo "" echo " -l, --login Iniciar sesión con el usuario y contraseña" echo " Uso: $0 -l NOMBRE_USUARIO PASSWORD" echo "" echo " -c, --crear Crear un nuevo usuario" echo " Uso: $0 -c NOMBRE_USUARIO" echo "" echo " -d, --eliminar Elimina la cuenta del usuario" echo " Uso: $0 -d NOMBRE_USUARIO" echo "" echo " -h, --ayuda Mostrar esta ayuda" echo "=============================================================" echo "" exit 1 } # Función para verificar si el usuario existe en el archivo loginusuarios.txt usuario_existe() { # Utiliza el comando grep para buscar la presencia de una línea que comience con el nombre de usuario proporcionado ($1) # seguido de dos puntos (:), lo que indicaría la presencia de un usuario en el archivo. # El modificador -q hace que grep opere en modo silencioso, sin mostrar resultados en pantalla. grep -q "^$1:" $ARCHIVO_LOGIN } # Función para crear un nuevo usuario crear_usuario() { usuario="$1" password="$2" # Encriptamos la contraseña proporcionada password_encriptado=$(encriptar_password $password) if usuario_existe $usuario; then echo "" echo "El usuario $usuario ya existe. No se puede crear." echo "" read -p "Pulsa Intro para continuar..." echo "" return 1 else # Guardamos los datos proporcionados en el archivo .txt echo "$usuario:$password_encriptado" >> $ARCHIVO_LOGIN echo "" return 0 fi } # Función para iniciar sesión login() { usuario="$1" password="$2" if usuario_existe $usuario; then # Buscamos el password encriptado del usuario, se desencripta y se compara con el password proporcionado para ver si coincide password_real_encriptado=$(grep "^$usuario:" $ARCHIVO_LOGIN | cut -d ':' -f 2) password_real=$(desencriptar_password $password_real_encriptado) if [ "$password" = "$password_real" ]; then clear fecha=$(date +"%d-%m-%Y %H:%M:%S") # Fecha y hora del sistema echo "" echo "===========================================" echo "¡Bienvenid@, te has logueado como $usuario!" echo "Fecha y hora: $fecha" echo "===========================================" echo "" exit 0 else echo "" echo "Contraseña incorrecta!!" echo "" return 1 fi else echo "" echo "El usuario $usuario no existe." echo "" return 2 fi } # Función para eliminar un usuario eliminar_usuario() { usuario="$1" # Verificar si el usuario existe en el archivo if usuario_existe $usuario; then # Solicitar confirmación al usuario antes de proceder read -p "¿Estás seguro de que deseas eliminar el usuario $usuario? (s/N): " confirmacion if [ "$confirmacion" = "s" ] || [ "$confirmacion" = "S" ]; then # Solicitar la contraseña del usuario read -s -p "Contraseña: " password echo "" # Obtener la contraseña real encriptada del archivo password_real_encriptado=$(grep "^$usuario:" $ARCHIVO_LOGIN | cut -d ':' -f 2) password_real=$(desencriptar_password $password_real_encriptado) # Comparar la contraseña proporcionada con la contraseña real if [ "$password" = "$password_real" ]; then # Eliminar la entrada del usuario del archivo sed -i "/^$usuario:/d" $ARCHIVO_LOGIN echo "" echo "El usuario $usuario ha sido eliminado correctamente." echo "" read -p "Pulsa Intro para continuar..." echo "" return 0 else # Contraseña incorrecta, mostrar mensaje y devolver error echo "" echo "Contraseña incorrecta. No se puede eliminar el usuario." echo "" read -p "Pulsa Intro para continuar..." echo "" return 1 fi else # Eliminación cancelada por el usuario echo "" echo "Eliminación cancelada." echo "" read -p "Pulsa Intro para continuar..." echo "" return 2 fi else # El usuario no existe en el archivo echo "" echo "El usuario $usuario no existe." echo "" read -p "Pulsa Intro para continuar..." echo "" return 3 fi } # Procesar argumentos de línea de comandos. Si no se proporcionan se cargará el menú if [ $# -gt 0 ]; then # Si se proporcionaron argumentos en la línea de comandos case $1 in -l|--login) # Opción: Iniciar sesión con el usuario y contraseña if [ $# -lt 3 ]; then # Verificar si se proporcionaron suficientes argumentos (nombre de usuario y contraseña) echo "" echo "Se requieren un nombre de usuario y contraseña válidos." echo "" exit 1 fi # Llamar a la función "login" para intentar el inicio de sesión con el nombre de usuario y contraseña dados login $2 $3 || exit 1 ;; -c|--crear) # Opción: Crear un nuevo usuario if [ -z "$2" ]; then # Verificar si se proporcionó un nombre de usuario válido echo "" echo "Se requiere un nombre de usuario válido." echo "" exit 1 fi if usuario_existe $2; then # Verificar si el usuario ya existe en los registros echo "" echo "El usuario $2 ya existe. No se puede crear." echo "" exit 1 fi # Solicitar al usuario una contraseña segura para el nuevo usuario read -s -p "Escribe una contraseña para crear el usuario $2: " new_password # Llamar a la función "crear_usuario" para crear al nuevo usuario con el nombre y contraseña dados crear_usuario $2 $new_password echo "" echo "El usuario $2 se ha creado de forma correcta." echo "" exit 0 ;; -d|--eliminar) # Opción: Eliminar usuario if [ $# -lt 2 ]; then echo "" echo "Se requiere un nombre de usuario válido." echo "" exit 1 fi eliminar_usuario $2 ;; -h|--ayuda) # Opción: Mostrar la ayuda ayuda ;; *) # Opción: Desconocida echo "" echo "Opción desconocida: $1" echo "" ayuda ;; esac else # Si no se proporcionaron argumentos en la línea de comandos, mostrar el menú interactivo clear while true; do cabecera "Menú" echo " 1. Iniciar sesión" echo " 2. Crear usuario" echo " 3. Eliminar usuario" echo " 0. Salir" echo "" read -p "Selecciona una opción: " menu_choice case $menu_choice in 1) # Opción 1: Iniciar sesión cabecera "Login" read -p "Nombre de usuario: " username if usuario_existe $username; then # Si el usuario existe en los registros, intentar iniciar sesión # Número de intentos posibles intentos=3 while [ $intentos -gt 0 ]; do read -s -p "Contraseña (intentos restantes: $intentos): " password echo if login $username $password; then break else intentos=$((intentos - 1)) if [ $intentos -gt 0 ]; then # echo "Contraseña incorrecta!!!" echo "" else echo "" echo "Has agotado tus intentos de inicio de sesión." echo "" read -p "Pulsa Intro para continuar..." echo "" fi fi done else # Si el usuario no existe, mostrar mensaje echo "" echo "No existe el usuario. Puedes crearlo desde el menú principal" echo "" read -p "Pulsa Intro para continuar..." echo "" fi ;; 2) # Opción 2: Crear usuario cabecera "Crear usuario" echo "" read -p "Nuevo nombre de usuario: " new_username echo "" if usuario_existe $new_username; then # Verificar si el usuario ya existe en los registros echo "El usuario $new_username ya existe. No se puede crear." echo "" read -p "Pulsa Intro para continuar..." echo "" else # Solicitar al usuario una contraseña segura para el nuevo usuario read -s -p "Contraseña: " new_password echo "" # Llamar a la función "crear_usuario" para crear al nuevo usuario con el nombre y contraseña dados crear_usuario $new_username $new_password echo "" echo "El usuario $new_username se ha creado correctamente" echo "" read -p "Pulsa Intro para continuar..." fi ;; 3) # Eliminar usuario cabecera "Eliminar usuario" read -p "Nombre de usuario: " delete_username eliminar_usuario $delete_username ;; 0) # Salir del programa echo "" echo "Saliendo del programa." echo "" exit 0 ;; *) # Opción inválida echo "" echo "Opción inválida." echo "" ;; esac done fi
El código en GitHub de este Script en bash para crear un login
En este artículo se ha explorado un script de Bash que aborda una serie de conceptos relacionados con la autenticación y la administración de cuentas de usuarios. Desde el inicio de sesión y la creación de cuentas hasta la eliminación de usuarios, el script demuestra un enfoque sólido y modular para abordar estas tareas críticas. La combinación de encriptación de contraseñas, manejo de errores y un menú interactivo brinda a los usuarios una experiencia segura y eficiente al interactuar con el sistema.
Además de poder obtener el código de este script en bash para crear un login básico en esta página, también se puede descargar desde el repositorio en GitHub en el que lo he subido.