Introducción
Los administradores suelen convertir las comprobaciones repetitivas en pequeños scripts de shell. El scripting al estilo RHCSA no consiste en escribir grandes programas, sino en utilizar Bash de forma segura para automatizar tareas comunes, validar entradas, iterar sobre objetivos, devolver códigos de salida útiles y generar resultados que otro administrador pueda comprender fácilmente.
En este laboratorio, creará un script de resumen de directorios paso a paso. El script aceptará rutas de directorios, comprobará si cada ruta es utilizable, recopilará información básica de los archivos, escribirá una salida legible y guardará esa misma salida en un archivo de registro (log).
Crear un script ejecutable
En este paso, inspeccionará los directorios de muestra y creará la primera versión ejecutable de un script de administración. Un script debe comenzar con un shebang para que el sistema sepa qué intérprete utilizar.
Acceda al directorio del proyecto.
cd /home/labex/project
Inspeccione el árbol de directorios de muestra. El comando find lista los archivos y directorios, y sort asegura que el orden sea estable.
find /home/labex/project/script-practice -maxdepth 2 -print | sort
Cree la primera versión de admin-summary.sh. La línea #!/bin/bash le indica a Linux que ejecute el archivo con Bash. La opción set -u hace que el script falle si utiliza una variable no definida, lo cual ayuda a detectar muchos errores de escritura.
cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u
echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"
EOF
Haga que el script sea ejecutable. Sin permisos de ejecución, el archivo es solo texto.
chmod 755 /home/labex/project/admin-summary.sh
Ejecute el script.
/home/labex/project/admin-summary.sh
Debería ver el título del script, el usuario actual y el nombre corto del host. El nombre exacto del host puede variar.
Aceptar argumentos de directorio
En este paso, añadirá parámetros posicionales. Un script utiliza $# para contar los argumentos y "$@" para representar todos los argumentos exactamente tal como fueron pasados.
Reemplace el script con una versión que requiera al menos un argumento de directorio.
cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u
if [ "$#" -eq 0 ]; then
echo "Usage: $0 DIRECTORY [DIRECTORY...]"
exit 2
fi
echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"
for target in "$@"; do
echo "TARGET=$target"
done
EOF
Mantenga el script ejecutable.
chmod 755 /home/labex/project/admin-summary.sh
Ejecútelo sin argumentos. El comando debería imprimir el texto de uso y devolver un estado de salida 2. El operador || ejecuta el comando de la derecha solo cuando el script de la izquierda falla, lo que le permite mostrar intencionalmente el estado distinto de cero.
/home/labex/project/admin-summary.sh || echo "exit status: $?"
Ahora ejecútelo con dos argumentos de directorio.
/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs
La salida debería incluir una línea TARGET= para cada argumento.
Probar cada objetivo y devolver un estado útil
En este paso, añadirá una prueba condicional para cada argumento. La prueba [ -d "$target" ] solo tiene éxito cuando la ruta existe y es un directorio.
Reemplace el script con una versión que informe OK para los directorios y MISSING para cualquier otra cosa.
cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u
if [ "$#" -eq 0 ]; then
echo "Usage: $0 DIRECTORY [DIRECTORY...]"
exit 2
fi
echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"
exit_status=0
for target in "$@"; do
if [ -d "$target" ]; then
echo "OK $target"
else
echo "MISSING $target"
exit_status=1
fi
done
exit "$exit_status"
EOF
Ejecute el script con un directorio válido. El estado de salida final debería ser 0.
/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app
echo "exit status: $?"
Ejecútelo de nuevo con un directorio inexistente. Esta vez, el script debería imprimir MISSING y devolver un estado de salida 1.
/home/labex/project/admin-summary.sh /home/labex/project/script-practice/missing || echo "exit status: $?"
Recopilar datos prácticos del directorio
En este paso, añadirá la sustitución de comandos. La sustitución de comandos ejecuta un comando dentro de $() y almacena su salida en una variable.
Reemplace el script con una versión que informe el recuento de archivos, el tamaño aparente y el propietario de cada directorio válido.
cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u
if [ "$#" -eq 0 ]; then
echo "Usage: $0 DIRECTORY [DIRECTORY...]"
exit 2
fi
echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"
exit_status=0
for target in "$@"; do
if [ -d "$target" ]; then
file_count="$(find "$target" -type f | wc -l)"
size="$(du -sh "$target" | awk '{print $1}')"
owner="$(stat -c '%U:%G' "$target")"
echo "OK $target FILES=$file_count SIZE=$size OWNER=$owner"
else
echo "MISSING $target"
exit_status=1
fi
done
exit "$exit_status"
EOF
Ejecute el script contra los tres directorios preparados.
/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs /home/labex/project/script-practice/cache
El directorio app debería mostrar FILES=3, logs debería mostrar FILES=2 y cache debería mostrar FILES=1.
Guardar la salida en un archivo de registro
En este paso, añadirá una pequeña función auxiliar y un archivo de registro. Una función evita la repetición de código, y tee -a muestra la salida en pantalla mientras añade la misma línea a un archivo.
Reemplace el script con la versión final.
cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u
LOG="/home/labex/project/admin-summary.log"
: > "$LOG"
emit() {
echo "$*" | tee -a "$LOG"
}
if [ "$#" -eq 0 ]; then
emit "Usage: $0 DIRECTORY [DIRECTORY...]"
exit 2
fi
emit "RHCSA admin summary"
emit "RUN_AS=$(id -un)"
emit "HOST=$(hostname -s)"
exit_status=0
for target in "$@"; do
if [ -d "$target" ]; then
file_count="$(find "$target" -type f | wc -l)"
size="$(du -sh "$target" | awk '{print $1}')"
owner="$(stat -c '%U:%G' "$target")"
emit "OK $target FILES=$file_count SIZE=$size OWNER=$owner"
else
emit "MISSING $target"
exit_status=1
fi
done
exit "$exit_status"
EOF
Ejecute el script final con dos directorios válidos y uno inexistente.
/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs /home/labex/project/script-practice/missing || echo "exit status: $?"
Inspeccione el registro guardado.
sed -n '1,8p' /home/labex/project/admin-summary.log
La salida de la terminal y el archivo de registro deberían contener las mismas líneas de resumen. Debido a que falta un objetivo, el estado de salida debería ser 1.
Resumen
Ha creado un script de administración práctico en Bash. Ha utilizado un shebang, permisos de ejecución, parámetros posicionales, conteo de argumentos, bucles, pruebas de directorios, sustitución de comandos, estados de salida explícitos, una función auxiliar y un archivo de registro. Estos son los patrones de scripting más útiles para pequeñas tareas de administración al estilo RHCSA.


