Desarrollo de Scripts Bash para Automatización y Gestión de Archivos y Usuarios en Linux

Clasificado en Informática

Escrito el en español con un tamaño de 4,98 KB

Ejercicios de Shell Scripting Avanzado

A continuación, se presentan una serie de ejercicios prácticos de Shell Scripting, diseñados para fortalecer las habilidades en la automatización de tareas y la administración de sistemas Linux. Cada ejercicio incluye una descripción detallada y una propuesta de solución en Bash.


1. Conteo de Archivos y Directorios en el Directorio Actual

Objetivo: Escribir un Shell script que permita registrar en un archivo llamado cantidad_archivos cuántos archivos y cuántos directorios hay en el directorio actual de trabajo. (20 puntos)

Script Propuesto:

#!/bin/bash

clear

cant_archivos=0
cant_directorios=0

for archivo in *
do
    if test -f "$archivo"
    then
        cant_archivos=$(echo "$cant_archivos+1" | bc)
    elif test -d "$archivo"
    then
        cant_directorios=$(echo "$cant_directorios+1" | bc)
    fi
done

echo "Cantidad de archivos: $cant_archivos" > cantidad_archivos
echo "Cantidad de directorios: $cant_directorios" >> cantidad_archivos

Explicación: Este script itera sobre todos los elementos (archivos y directorios) en el directorio actual. Utiliza test -f para identificar archivos regulares y test -d para identificar directorios. Los contadores se incrementan y, finalmente, los resultados se guardan en el archivo cantidad_archivos.


2. Filtrado de Líneas por Vocal Inicial en Archivos

Objetivo: Escribir un script Shell que permita recibir dos archivos como argumentos. El script debe validar que los parámetros recibidos sean realmente archivos y que el primer archivo (archivo de entrada) no esté vacío. Luego, deberá guardar en el otro archivo (archivo de salida) las líneas que comienzan con una vocal (mayúscula o minúscula) del archivo de entrada. (25 puntos)

Script Propuesto:

#!/bin/bash

clear

# Validar que se recibieron dos argumentos
if [ "$#" -ne 2 ]; then
    echo "Uso: $0 <archivo_entrada> <archivo_salida>"
    exit 1
fi

ARCHIVO_ENTRADA="$1"
ARCHIVO_SALIDA="$2"

# Validar que ambos argumentos son archivos
if test -f "$ARCHIVO_ENTRADA" && test -f "$ARCHIVO_SALIDA"; then
    # Validar que el archivo de entrada no está vacío
    if test -s "$ARCHIVO_ENTRADA"; then
        # Filtrar líneas que comienzan con una vocal (mayúscula o minúscula)
        grep -i "^[aeiou]" "$ARCHIVO_ENTRADA" > "$ARCHIVO_SALIDA"
        echo "Líneas filtradas guardadas en '$ARCHIVO_SALIDA'."
    else
        echo "Error: El archivo de entrada '$ARCHIVO_ENTRADA' está vacío."
        exit 1
    fi
else
    echo "Error: Ambos argumentos deben ser archivos válidos."
    echo "Asegúrese de que '$ARCHIVO_ENTRADA' y '$ARCHIVO_SALIDA' existen y son archivos."
    exit 1
fi

Explicación: Este script realiza varias validaciones antes de procesar los archivos. Primero, verifica que se hayan proporcionado dos argumentos. Luego, comprueba que ambos argumentos corresponden a archivos existentes y que el archivo de entrada no está vacío. Finalmente, utiliza grep -i "^[aeiou]" para encontrar y extraer las líneas que comienzan con una vocal (ignorando mayúsculas/minúsculas) y las redirige al archivo de salida.


3. Identificación de Usuarios Inactivos en el Sistema

Contexto: Todas las cuentas de usuarios poseen una entrada en el archivo /etc/passwd, aún cuando algunos de estos usuarios nunca hayan llegado a abrir una sesión. A estos usuarios los llamaremos “usuarios inactivos”. Si un usuario es inactivo, el comando finger mostrará “Never logged in.

Ejemplo de Salida del Comando finger:

# finger alumno
Login: alumno Name: Alumno DUOC UC
Directory: /home/alumno Shell: /bin/bash
Never logged in.
No mail.
No Plan.

Objetivo: Escribir un Shell script que permita listar los usuarios inactivos del sistema al momento de la ejecución del script. (25 puntos)

Script Propuesto:

#!/bin/bash

clear

# Iterar sobre cada usuario listado en /etc/passwd
for USUARIO in $(cut -f 1 -d : /etc/passwd)
do
    # Ejecutar finger para el usuario y buscar la cadena "Never logged in."
    finger "$USUARIO" | grep -i "Never logged in."
    
    # Si grep encuentra la cadena (código de salida 0), el usuario es inactivo
    if test $? -eq 0
    then
        echo -e "$USUARIO es un usuario inactivo\n"
    fi
done

Explicación: El script extrae la lista de nombres de usuario del archivo /etc/passwd utilizando cut. Para cada usuario, ejecuta el comando finger y filtra su salida con grep -i "Never logged in.". Si grep encuentra la frase (indicado por un código de salida de 0), el script imprime que el usuario es inactivo.

Entradas relacionadas: