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.