Una vez más aquí. Hoy vengo a dejar un pequeño artículo relacionado con Bash y con la administración básica de un sistema Ubuntu. Por eso, en las siguiente líneas vamos a ver un script de administración básica en Bash que nos permitirá realizar diversas tareas comunes en un sistema Gnu/Linux. Para hacerlo un poco más legible y «bonico» de ver, el script utiliza la herramienta tput
para aplicar colores y estilo al menú, lo que creo que facilita su uso y visualización.
Tego que aclarar que en caso de que esta herramienta no esté instalada en el sistema, el script tratará de instalarla. Pero la instalación solo funcionará si se está ejecutando en un sistema Ubuntu o derivados.
Entre las diferentes cosas que permite realizar este script, se pueden encontrar funciones para trabajar con ficheros. Estas permitirán listar el contenido de un directorio, crear y editar ficheros, copiar y mover ficheros, eliminar ficheros seleccionados por el usuario, y mostrar los permisos de un fichero o directorio. Además, incluye funciones para la administración de usuarios y grupos, como listar usuarios y grupos del sistema, crear y eliminar usuarios y grupos, desactivar usuarios y asignar usuarios a grupos.
Estas son solo algunas de las cosas que podremos realizar en nuestro sistema. A continuación se enumeran en detalle cada una de las opciones disponibles en este script en Bash.
Funciones disponibles de este Script en Bash
- Listar contenido de un directorio Esta opción permite al usuario escribir la ruta de un directorio. Además muestra el contenido del mismo en formato largo, incluyendo archivos ocultos.
- Crear un fichero Con esta opción, el usuario puede especificar la ruta de un directorio donde quiere crear un nuevo fichero. Se le pedirá también que escriba el nombre del fichero a crear.
- Leer un fichero Esta opción permite al usuario escribir la ruta de un fichero existente y muestra su contenido en la consola.
- Editar un fichero Al seleccionar esta opción, el usuario tendrá que proporcionar la ruta de un fichero existente. A continuación, se abrirá el editor de texto
nano
para editar el contenido del fichero. Cuando se cierre nano, volveremos al script. - Copiar un fichero El usuario debe escribir la ruta de un fichero existente y la ruta del directorio de destino. El fichero será copiado a la ubicación de destino.
- Mover un fichero Similar a la opción anterior, pero en este caso, el fichero es movido a la ubicación de destino en lugar de copiarse.
- Eliminar ficheros El usuario puede escribir una lista de nombres de ficheros, separados por espacios. Después se muestra la lista de ficheros a eliminar, y se solicita confirmación antes de proceder con la eliminación.
- Mostrar permisos de un fichero o directorio Esta opción permite al usuario escribir la ruta de un fichero o directorio. Después se van a mostrar los permisos en formato largo.
- Instalar un paquete El usuario puede escribir el nombre de un paquete para ser instalado utilizando el gestor de paquetes de la distribución (APT). Antes de la instalación, el script verifica si el paquete está disponible en los repositorios. De no encontrarse en los repositorios instalados en el equipo, se abotará la instalación.
- Matar un proceso Muestra una lista de los 10 procesos que más recursos consumen y otra lista de los procesos colgados. El usuario debe ingresar el nombre o PID de un proceso para terminarlo enviando la señal SIGTERM (15).
- Listar los usuarios del sistema Esta opción va a mostrar una lista con los nombres de usuario registrados en el sistema.
- Crear un usuario Con esta opción se puede crear un nuevo usuario escribiendo su nombre.
- Desactivar un usuario El usuario debe escribir el nombre de un usuario existente para desactivarlo. Esto lo bloquea temporalmente para iniciar sesión.
- Eliminar un usuario Esta opción permite al usuario eliminar un usuario existente escribiendo su nombre. La eliminación es irreversible.
- Crear un grupo Permite al usuario crear un nuevo grupo escribiendo el nombre del grupo.
- Listar grupos Muestra una lista con los nombres de los grupos registrados en el sistema.
- Eliminar un grupo El usuario debe escribir el nombre de un grupo existente para eliminarlo. La eliminación es irreversible.
- Asignar usuarios a grupos Esta opción permite al usuario agregar varios usuarios a un grupo específico escribiendo sus nombres separados por espacios.
- Crear usuarios desde un archivo Permite al usuario crear múltiples usuarios a la vez leyendo sus nombres desde un archivo de texto.
- Información del sistema Muestra información relevante sobre el sistema, como el ID del vendedor, el nombre del modelo, la frecuencia de la CPU, la memoria total y libre, la arquitectura y la versión del kernel.
- Salir Esta opción permite al usuario salir del script y finalizar la ejecución.
El código del Script
#!/bin/bash # Colores y estilo para el menú verde=$(tput setaf 2) # Color verde rojo=$(tput setaf 1) # Color rojo amarillo=$(tput setaf 3) # Color amarillo azul=$(tput setaf 4) # Color azul normal=$(tput sgr0) # Restaurar color por defecto negrita=$(tput bold) # Texto en negrita # Función para comprobar y, si es necesario, instalar la dependencia tput function verificar_tput() { if ! command -v tput &>/dev/null; then echo -n "${amarillo}La herramienta 'tput' no está instalada. Instalando." for _ in {1..3}; do echo -n " . " sleep 1 done echo "${normal}" if [[ "$(uname)" == "Linux" ]]; then sudo apt-get update sudo apt-get install -y ncurses-bin else clear echo echo "${amarillo}Comprobando dependencias. " for _ in {1..3}; do echo -n " . " sleep 1 done echo "${rojo}No se pudo detectar el sistema operativo. Por favor, instala 'tput' manualmente o no se verán los colores.${normal}" sleep 3 exit 1 fi clear echo -n "${amarillo}Comprobando dependencias." for _ in {1..3}; do echo -n " . " sleep 1 done echo "${normal}" echo "${verde}¡'tput' se ha instalado correctamente!${normal}" sleep 3 else clear echo -n "${amarillo}Comprobando dependencias." for _ in {1..3}; do echo -n " . " sleep 1 done echo "${normal}" echo "${verde}¡Todas las dependencias necesarias para una correcta visualización están instaladas en el sistema!${normal}" sleep 3 fi } # Llamada a la función verificar_tput para comprobar si tput está instalado verificar_tput # Función para mostrar la cabecera function cabecera() { echo "${negrita}${verde}===============================" echo " $1" echo "===============================${normal}" echo "" } # Función para seleccionar un directorio y listar su contenido function listar_contenido_directorio() { clear cabecera "Listar contenido directorio" echo "" read -p "${negrita}${amarillo}Escribe la ruta del directorio: ${normal}" directorio # Verificar si el directorio existe if [[ ! -d "$directorio" ]]; then echo "" echo "${negrita}${rojo}El directorio \"$directorio\" no existe. La operación ha sido abortada.${normal}" return fi # Lista el contenido del directorio sin ocular las entradas que comienzan con . utilizando formato largo ls -la "$directorio" } # Función para crear un fichero con comprobación de existencia de la ruta function crear_fichero() { clear cabecera " Crear un fichero" echo "" read -p "${negrita}${amarillo}Escribe la ruta del directorio donde desea crear el fichero: ${normal}" directorio # Verificar si el directorio existe if [[ ! -d "$directorio" ]]; then echo "" echo "${negrita}${rojo}El directorio \"$directorio\" no existe. La creación del fichero ha sido abortada.${normal}" return fi echo "" read -p "${negrita}${amarillo}Escribe el nombre del fichero: ${normal}" nombre_fichero # Crea el archivo en el directorio indicado touch "$directorio/$nombre_fichero" echo "" echo "${negrita}${verde}Fichero creado: ${normal} $directorio/$nombre_fichero" } # Función para leer un fichero indicado por el usuario function leer_fichero() { clear cabecera " Leer un fichero" echo "" read -p "${negrita}${amarillo}Escribe la ruta del fichero que quieres leer: ${normal}" fichero if [ -f "$fichero" ]; then cat "$fichero" else echo "" echo "${negrita}${rojo}El fichero no existe.${normal}" fi } # Función para editar un fichero indicado por el usuario function editar_fichero() { clear cabecera " Editar un fichero" echo "" read -p "${negrita}${amarillo}Escribe la ruta del fichero que quieres editar: ${normal}" fichero if [ -f "$fichero" ]; then nano "$fichero" else echo "" echo "${negrita}${rojo}El fichero no existe.${normal}" fi } # Función para copiar un fichero de un directorio a otro function copiar_fichero() { clear cabecera " Copiar un fichero" echo "" read -p "${negrita}${amarillo}Escribe la ruta del fichero que quieres copiar: ${normal}" origen # Comprobar si el archivo de origen existe if [[ ! -e "$origen" ]]; then echo "" echo "${negrita}${rojo}El archivo de origen no existe.${normal}" return fi echo "" read -p "${negrita}${amarillo}Escribe la ruta del directorio de destino: ${normal}" destino # Comprobar si la ruta de destino existe if [[ ! -d "$destino" ]]; then echo "" echo "${negrita}${rojo}El directorio de destino no existe.${normal}" return fi # Copia el archivo en el destino indicado cp "$origen" "$destino" echo "" echo "${negrita}${verde}Fichero copiado a $destino${normal}" } # Función para mover un fichero de un directorio a otro function mover_fichero() { clear cabecera " Mover un fichero" echo "" read -p "${negrita}${amarillo}Escribe la ruta del fichero que quieres mover: ${normal}" origen # Comprobar si el archivo de origen existe if [[ ! -e "$origen" ]]; then echo "" echo "${negrita}${rojo}El archivo de origen no existe.${normal}" return fi echo "" read -p "${negrita}${amarillo}Escribe la ruta del directorio de destino: ${normal}" destino # Comprobar si la ruta de destino existe if [[ ! -d "$destino" ]]; then echo "" echo "${negrita}${rojo}El directorio de destino no existe.${normal}" return fi # Con -i se sobreescribe el detino, en caso de existir (sin probar) mv -i "$origen" "$destino" echo "" echo "${negrita}${verde}Fichero movido a $destino${normal}" } # Función para eliminar ficheros indicados por el usuario function eliminar_ficheros() { clear cabecera " Eliminar ficheros" echo "" read -p "${negrita}${amarillo}Escribe una lista de ficheros separados por espacios que quieras eliminar: ${normal}" ficheros # Verificar si se ingresaron archivos if [ -z "$ficheros" ]; then echo "${negrita}${rojo}No se escribieron nombres de ficheros para eliminar. Por ello se cancela la eliminación de ficheros.${normal}" return fi # Mostrar la lista de ficheros a eliminar echo "" echo "${negrita}${azul}Los siguientes ficheros serán eliminados:${normal}" echo "$ficheros" # Pedir confirmación antes de eliminar echo "" read -p "${negrita}${rojo}¿Estás MUY seguro de que quieres eliminar estos ficheros? (S/n): ${normal}" confirmacion # Convertir la confirmación a minúsculas para hacerla insensible a mayúsculas o minúsculas confirmacion=${confirmacion,,} if [ "$confirmacion" == "s" ]; then rm -i $ficheros echo "${negrita}${verde}Ficheros eliminados de forma correcta.${normal}" else echo "${negrita}${rojo}La operación de eliminación fue cancelada.${normal}" fi } # Función para mostrar los permisos de un fichero o directorio function mostrar_permisos() { clear cabecera " Mostrar permisos" echo "" read -p "${negrita}${amarillo}Escribe la ruta del fichero o directorio: ${normal}" ruta # Verificar si la ruta existe if [[ -e "$ruta" ]]; then # Lista los directorios (no su contenido) en formato largo ls -ld "$ruta" break else echo "" echo "${negrita}${rojo}La ruta \"$ruta\" no existe. Inténtalo de nuevo.${normal}" fi } # Función para instalar un paquete determinado si existe en los repositorios function instalar_paquete() { clear cabecera " Instalar paquete" echo "" while true; do read -p "${negrita}${amarillo}Escribe el nombre del paquete que quieras instalar: ${normal}" paquete # Verificar si el nombre del paquete está vacío o solo contiene espacios if [[ -z "$paquete" ]]; then echo "${negrita}${rojo}El nombre del paquete no puede estar vacío. Inténtalo de nuevo.${normal}" else # Redirigir tanto la salida estándar (stdout) como la salida de error (stderr) a /dev/null if apt-cache show "$paquete" &>/dev/null; then sudo apt-get install "$paquete" break else echo "${negrita}${rojo}El paquete \"$paquete\" no se encuentra en los repositorios, por lo que no se puede instalar.${normal}" break fi fi done } # Función para matar un proceso seleccionado por el usuario function matar_proceso() { clear cabecera " Matar un proceso" # Mostrar los 10 procesos que más recursos consumen echo "" echo "${negrita}${amarillo}Los 10 procesos que más recursos consumen:${normal}" ps aux --sort=-%cpu | head -n 11 # Mostrar los procesos que están colgados echo "" echo "${negrita}${amarillo}Los procesos que están colgados:${normal}" ps aux | awk '$8 ~ /D/ { print }' # Pedir al usuario que indique el proceso a matar read -p "${negrita}${amarillo}Escribe el nombre o PID del proceso que quieras matar: ${normal}" proceso # Mostrar el proceso a matar echo "" echo "${negrita}${amarillo}Proceso a matar: ${normal} $proceso" # Pedir confirmación antes de matar echo "" read -p "${negrita}${rojo}¿Estás seguro de que quieres matar este proceso? (S/n): ${normal}" confirmacion # Convertir la confirmación a minúsculas para hacerla insensible a mayúsculas o minúsculas confirmacion=${confirmacion,,} if [ "$confirmacion" == "s" ]; then # Enviar la señal SIGTERM (15) al proceso para terminarlo adecuadamente kill -15 $proceso echo "" echo "${negrita}${verde}Proceso terminado: ${normal} $proceso" else echo "" echo "${negrita}${rojo}La operación de terminación fue cancelada.${normal}" fi } # Función para listar los usuarios del sistema function listar_usuarios() { clear cabecera "Listar usuarios del sistema" # Listado de los usuarios del sistema cut -d: -f1 /etc/passwd | more } # Función para crear un usuario function crear_usuario() { clear cabecera " Crear usuario" echo "" read -p "${negrita}${amarillo}Escribe el nombre del usuario que quieres crear: ${normal}" usuario # Verificar si el usuario ya existe en el sistema if getent passwd "$usuario" >/dev/null; then echo "" echo "${negrita}${rojo}El usuario \"$usuario\" ya existe en el sistema. La creación del usuario ha sido abortada.${normal}" return fi # Creamos el usuario sudo useradd "$usuario" echo "" echo "${negrita}${verde}Usuario creado: ${normal} $usuario" } # Función para desactivar un usuario function desactivar_usuario() { clear cabecera " Desactivar usuario" echo "" read -p "${negrita}${amarillo}Escribe el nombre del usuario que quieres desactivar: ${normal}" usuario # Mostrar el nombre del usuario a desactivar echo "" echo "${negrita}${amarillo}Usuario a desactivar: ${normal} $usuario" # Pedir confirmación antes de desactivar echo "" read -p "${negrita}${rojo}¿Estás seguro de que quieres desactivar este usuario? (S/n): ${normal}" confirmacion # Convertir la confirmación a minúsculas para hacerla insensible a mayúsculas o minúsculas confirmacion=${confirmacion,,} if [ "$confirmacion" == "s" ]; then sudo usermod -L "$usuario" echo "" echo "${negrita}${verde}Usuario desactivado: ${normal} $usuario" else echo "" echo "${negrita}${rojo}La operación de desactivación fue cancelada.${normal}" fi } # Función para eliminar un usuario function eliminar_usuario() { clear cabecera " Eliminar usuario" echo "" read -p "${negrita}${amarillo}Escribe el nombre del usuario que quieres eliminar: ${normal}" usuario # Mostrar el nombre del usuario a eliminar echo "" echo "${negrita}${amarillo}Usuario a eliminar: ${normal} $usuario" # Pedir confirmación antes de eliminar echo "" read -p "${negrita}${rojo}¿Estás seguro de que quieres eliminar este usuario? (S/n): ${normal}" confirmacion # Convertir la confirmación a minúsculas para hacerla insensible a mayúsculas o minúsculas confirmacion=${confirmacion,,} if [ "$confirmacion" == "s" ]; then sudo userdel "$usuario" echo "" echo "${negrita}${verde}Usuario eliminado: ${normal} $usuario" else echo "" echo "${negrita}${rojo}La operación de eliminación fue cancelada.${normal}" fi } # Función para crear un grupo function crear_grupo() { clear cabecera " Crear grupo" echo "" read -p "${negrita}${amarillo}Escribe el nombre del nuevo grupo: ${normal}" grupo # Verificar si el grupo ya existe en el sistema if getent group "$grupo" >/dev/null; then echo "" echo "${negrita}${rojo}El grupo \"$grupo\" ya existe en el sistema. La creación del grupo ha sido cancelada.${normal}" return fi # Creación del grupo sudo groupadd "$grupo" echo "" echo "${negrita}${verde}Grupo creado: ${normal} $grupo" } # Función para listar los grupos del sistema function listar_grupos() { clear cabecera " Listar grupos" echo "${negrita}${amarillo}Grupos encontrados en el sistema:${normal}" # Listado de los grupos del sistema cut -d: -f1 /etc/group | more } # Función para eliminar un grupo function eliminar_grupo() { clear cabecera " Eliminar grupo" echo "" read -p "${negrita}${amarillo}Escribe el nombre del grupo que quieras eliminar: ${normal}" grupo # Mostrar el nombre del grupo a eliminar echo "" echo "${negrita}${amarillo}Grupo a eliminar: ${normal} $grupo" # Pedir confirmación antes de eliminar echo "" read -p "${negrita}${rojo}¿Estás seguro de que quieres eliminar este grupo? (S/n): ${normal}" confirmacion # Convertir la confirmación a minúsculas para hacerla insensible a mayúsculas o minúsculas confirmacion=${confirmacion,,} if [ "$confirmacion" == "s" ]; then # Eliminamos el grupo sudo groupdel "$grupo" echo "" echo "${negrita}${verde}Grupo eliminado: ${normal} $grupo" else echo "" echo "${negrita}${rojo}La operación de eliminación fue cancelada.${normal}" fi } # Función para asignar usuarios a grupos function asignar_usuarios_a_grupo() { clear cabecera "Asignar usuarios a un grupo" echo "" read -p "${negrita}${amarillo}Escribe el nombre del grupo al que añadir los usuarios: ${normal}" grupo # Verificar si el grupo existe en el sistema if ! getent group "$grupo" >/dev/null; then echo "" echo "${negrita}${rojo}El grupo \"$grupo\" no existe en el sistema. La asignación de usuarios ha sido abortada.${normal}" return fi echo "" read -p "${negrita}${amarillo}Escribe una lista de usuarios, separados por espacios, que quieras añadir al grupo: ${normal}" usuarios # Verificar si todos los usuarios existen en el sistema for usuario in $usuarios; do if ! getent passwd "$usuario" >/dev/null; then echo "" echo "${negrita}${rojo}El usuario \"$usuario\" no existe en el sistema. La asignación de usuarios ha sido abortada.${normal}" return fi done # Añadimos los usuarios al grupo sudo usermod -aG "$grupo" $usuarios echo "" echo "${negrita}${verde}Usuarios asignados al grupo: ${normal}$grupo" } # Función para crear usuarios leyendo sus nombres de un archivo de texto function crear_usuarios_desde_archivo() { clear cabecera "Crear usuarios desde archivo" echo "" read -p "${negrita}${amarillo}Escribe la ruta del archivo de texto con los nombres de usuario: ${normal}" archivo # Verificar si el archivo existe if [ ! -f "$archivo" ]; then echo "" echo "${negrita}${rojo}El archivo \"$archivo\" no existe. La creación de usuarios ha sido abortada.${normal}" return fi while IFS= read -r usuario do # Verificar si el usuario ya existe en el sistema if getent passwd "$usuario" >/dev/null; then echo "" echo "${negrita}${rojo}El usuario \"$usuario\" ya existe en el sistema. La creación de usuarios ha sido abortada.${normal}" return fi sudo useradd "$usuario" echo "" echo "${negrita}${verde}Usuario creado: ${normal} $usuario" done < "$archivo" echo "" echo "${negrita}${verde}Creación de usuarios desde archivo completada.${normal}" } # Función para mostrar información del sistema function informacion_sistema() { clear cabecera " Información del sistema" # Verificar si se tienen los permisos de sudo. Es necesario lanzar el script con sudo o estar logueado como root if sudo -n true 2>/dev/null; then echo "" echo "${negrita}${verde}-- Tienes permisos de root para acceder a la información del sistema --${normal}" echo "" else echo "" echo "${negrita}${rojo}-- Esta tarea requiere permisos de root --${normal}" echo "" return fi echo "" echo "${negrita}${amarillo}- ID del vendedor: ${normal} $(sudo dmidecode -s system-manufacturer)" echo "" echo "${negrita}${amarillo}- Nombre del modelo: ${normal} $(sudo dmidecode -s system-product-name)" echo "" # Obtener la frecuencia de la CPU utilizando cat /proc/cpuinfo cpu_mhz=$(cat /proc/cpuinfo | grep "cpu MHz" | head -n 1 | awk '{print $4}') if [ -z "$cpu_mhz" ]; then echo "${negrita}${rojo}- No se pudo obtener la frecuencia de la CPU.${normal}" else echo "${negrita}${amarillo}- CPU MHz: ${normal} $cpu_mhz" fi echo "" echo "${negrita}${amarillo}- Memoria total: ${normal} $(free -h | grep "Mem" | awk '{print $2}')" echo "" echo "${negrita}${amarillo}- Memoria libre: ${normal} $(free -h | grep "Mem" | awk '{print $7}')" echo "" echo "${negrita}${amarillo}- Arquitectura: ${normal} $(uname -m)" echo "" echo "${negrita}${amarillo}- Versión del kernel: ${normal} $(uname -r)" } # Menú principal while true; do clear echo "${negrita}${verde}=====================================" echo " Menú de administración básico " echo "=====================================${normal}" echo "${negrita}${rojo}1.${normal} Listar contenido de un directorio" echo "${negrita}${rojo}2.${normal} Crear un fichero" echo "${negrita}${rojo}3.${normal} Leer un fichero" echo "${negrita}${rojo}4.${normal} Editar un fichero" echo "${negrita}${rojo}5.${normal} Copiar un fichero" echo "${negrita}${rojo}6.${normal} Mover un fichero" echo "${negrita}${rojo}7.${normal} Eliminar ficheros" echo "${negrita}${rojo}8.${normal} Mostrar permisos de un fichero o directorio" echo "${negrita}${rojo}9.${normal} Instalar un paquete" echo "${negrita}${rojo}10.${normal} Matar un proceso" echo "${negrita}${rojo}11.${normal} Listar los usuarios del sistema" echo "${negrita}${rojo}12.${normal} Crear un usuario" echo "${negrita}${rojo}13.${normal} Desactivar un usuario" echo "${negrita}${rojo}14.${normal} Eliminar un usuario" echo "${negrita}${rojo}15.${normal} Crear un grupo" echo "${negrita}${rojo}16.${normal} Listar grupos" echo "${negrita}${rojo}17.${normal} Eliminar un grupo" echo "${negrita}${rojo}18.${normal} Asignar usuarios a grupos" echo "${negrita}${rojo}19.${normal} Crear usuarios desde un archivo" echo "${negrita}${rojo}20.${normal} Información del sistema" echo "" echo "${negrita}${rojo}0.${normal} Salir" echo "" echo "${negrita}${verde}=====================================${normal}" read -p "${negrita}${amarillo}Selecciona una opción: ${normal}" opcion case $opcion in 1) listar_contenido_directorio ;; 2) crear_fichero ;; 3) leer_fichero ;; 4) editar_fichero ;; 5) copiar_fichero ;; 6) mover_fichero ;; 7) eliminar_ficheros ;; 8) mostrar_permisos ;; 9) instalar_paquete ;; 10) matar_proceso ;; 11) listar_usuarios ;; 12) crear_usuario ;; 13) desactivar_usuario ;; 14) eliminar_usuario ;; 15) crear_grupo ;; 16) listar_grupos ;; 17) eliminar_grupo ;; 18) asignar_usuarios_a_grupo ;; 19) crear_usuarios_desde_archivo ;; 20) informacion_sistema ;; 0) echo "" ; echo "${negrita}${azul}Saliendo...${normal}"; echo "" ; exit 0 ;; *) echo "${negrita}${rojo}Opción inválida. Intentalo de nuevo.${normal}" ;; esac echo "" echo "${negrita}${amarillo}Pulsa Intro para continuar...${normal}" read -r done
En resumen, este script de administración básica en Bash es una herramienta útil para automatizar tareas comunes en un sistema Gnu/Linux. Lo cual permite ahorrar tiempo y esfuerzo al realizar tareas de administración. Con su interfaz sencilla y amigable, incluso los usuarios menos experimentados pueden realizar tareas de administración de forma rápida y eficiente.
Tengo que decir que quizás me ha quedado un poquito largo, y que quizás no utilice las mejores posibilidades para realizar ciertas tareas, pero en mi sistema funciona … y como lo he comentado practicamente todo, cualquiera puede entender que hace cada parte del script.
Este script se puede descargar también desde el repositorio en GitHub donde lo he alojado, para quien lo quiera pueda descargarlo, modificarlo y utilizarlo para sus fines particulares (si es que le sirve a alguien).