Automatización y Gestión de Sistemas: Scripts Esenciales en Bash y Python
Este documento presenta una colección de scripts y fragmentos de código diseñados para diversas tareas de administración de sistemas y programación. Incluye ejemplos prácticos en Bash para la gestión de archivos, directorios, usuarios y procesos, así como un script en Python para la manipulación de archivos de texto. Cada sección detalla la funcionalidad y el propósito del código, proporcionando una referencia útil para la automatización de tareas cotidianas en entornos de TI.
Scripts Bash para Administración de Sistemas
Script 1: Inversión de Líneas de Texto
Este script de Bash permite al usuario introducir múltiples líneas de texto y, una vez finalizada la entrada (mediante una línea vacía), las muestra en orden inverso.
Funcionalidad:
- Entrada interactiva: Solicita al usuario que introduzca líneas de texto una por una.
- Almacenamiento en array: Las líneas se guardan en un array de Bash.
- Salida invertida: Imprime las líneas almacenadas desde la última hasta la primera.
# Array para almacenar las líneas
declare -a lines
echo "Introduce líneas de texto. Presiona Enter para cada línea."
echo "Cuando hayas terminado, introduce una línea vacía para finalizar."
# Leer líneas hasta que se introduzca una línea vacía
while IFS= read -r line; do
if [ -z "$line" ]; then
break
fi
lines+=("$line")
done
# Mostrar las líneas en orden invertido
echo "Las líneas introducidas en orden invertido son:"
for (( i=${#lines[@]} - 1; i >= 0; i-- )); do
echo "${lines[i]}"
done
Script 2: Conteo de Archivos y Directorios
Este script de Bash cuenta el número total de archivos y directorios dentro de un directorio especificado como argumento. Es útil para obtener un resumen rápido de la estructura de un directorio.
Funcionalidad:
- Validación de argumentos: Verifica que se proporcione exactamente un directorio como argumento.
- Verificación de existencia: Comprueba si el directorio especificado existe.
- Conteo preciso: Utiliza el comando
find
junto conwc -l
para contar archivos y directorios, excluyendo el directorio raíz del conteo de directorios.
# Verificar si se ha proporcionado un directorio como argumento
if [ $# -ne 1 ]; then
echo "Uso: $0 <directorio>"
exit 1
fi
# Directorio proporcionado como primer argumento
directory="$1"
# Verificar si el directorio existe
if [ ! -d "$directory" ]; then
echo "El directorio '$directory' no existe."
exit 1
fi
# Contadores para archivos y directorios
file_count=0
dir_count=0
# Usamos find para recorrer los archivos y directorios dentro del directorio dado
# Utilizamos -type f para archivos y -type d para directorios
# wc -l cuenta el número de líneas que es el número de archivos/directorios encontrados
file_count=$(find "$directory" -type f | wc -l)
dir_count=$(find "$directory" -type d | wc -l)
# Restamos 1 al contar directorios para excluir el directorio raíz
(( dir_count-- ))
# Mostramos los resultados
echo "Número total de archivos: $file_count"
echo "Número total de directorios: $dir_count"
Script 3: Gestión de Usuarios y Grupos (Función)
Este fragmento de código Bash define una función crear_grupo_y_usuario()
que automatiza la creación de un grupo y la adición de un nuevo usuario a dicho grupo en un sistema Linux. Es fundamental para la administración de usuarios y permisos.
Funcionalidad:
- Creación de grupo: Verifica si el grupo ya existe; si no, lo crea.
- Creación de usuario: Verifica si el usuario ya existe; si no, lo crea y lo asocia al grupo especificado.
- Asignación de grupo: Asegura que el usuario sea miembro del grupo.
- Manejo de errores: Informa si el grupo o usuario ya existen.
crear_grupo_y_usuario() {
local grupo="$1"
local usuario="$2"
local login="$3"
# Verificar si el grupo ya existe
if getent group "$grupo" > /dev/null 2>&1; then
echo "Error: El grupo '$grupo' ya existe."
exit 1
else
# Crear el grupo
sudo groupadd "$grupo"
echo "Grupo '$grupo' creado."
fi
# Verificar si el usuario ya existe
if id "$usuario" > /dev/null 2>&1; then
echo "El usuario '$usuario' ya existe."
else
# Crear el usuario y agregarlo al grupo
sudo useradd -m -g "$grupo" -c "$login" "$usuario"
echo "Usuario '$usuario' creado y agregado al grupo '$grupo'."
fi
# Agregar el usuario al grupo (redundante si useradd -g ya lo hizo, pero asegura)
sudo usermod -a -G "$grupo" "$usuario"
echo "Usuario '$usuario' agregado al grupo '$grupo'."
}
# Ejemplo de llamada a la función (asumiendo argumentos pasados al script principal)
# crear_grupo_y_usuario "$1" "$2" "$3"
Script 4: Monitor de Procesos Interactivo
Este script de Bash proporciona un menú interactivo para monitorear y gestionar procesos en un sistema Linux. Es una herramienta práctica para la depuración y el mantenimiento del sistema.
Funcionalidad:
- Listar procesos: Muestra todos los procesos en ejecución.
- Buscar proceso: Permite buscar procesos por nombre.
- Terminar proceso: Permite matar un proceso por su PID.
- Menú interactivo: Ofrece opciones claras al usuario.
#!/bin/bash
mostrar_procesos() {
echo "Procesos en ejecución:"
ps aux
}
buscar_proceso() {
echo -n "Introduce el nombre del proceso a buscar: "
read nombre_proceso
echo "Procesos que contienen '$nombre_proceso':"
ps aux | grep "$nombre_proceso"
}
matar_proceso() {
echo -n "Introduce el PID del proceso a terminar: "
read pid_proceso
kill -9 "$pid_proceso"
echo "Proceso con PID $pid_proceso ha sido terminado."
}
menu() {
echo "\n--- Menú de Monitor de Procesos ---"
echo "1. Mostrar la lista de procesos en ejecución"
echo "2. Buscar un proceso por nombre"
echo "3. Terminar un proceso por su PID"
echo "4. Salir"
echo -n "Elige una opción: "
read opcion
}
while true; do
menu
case $opcion in
1) mostrar_procesos ;;
2) buscar_proceso ;;
3) matar_proceso ;;
4) echo "Saliendo del programa."; exit ;;
*) echo "Opción no válida. Por favor, elige una opción del 1 al 4." ;;
esac
done
Script 5: Gestión de Usuarios y Grupos desde Archivo de Configuración
Este script de Bash lee un archivo de configuración (users_config.txt
) para automatizar la creación de grupos y usuarios. Es ideal para la configuración inicial de sistemas o la gestión masiva de cuentas.
Formato del archivo users_config.txt
:
tipo:nombre:argumentos
Ejemplos:
grupo:desarrollo:usuario1,usuario2
usuario:juan:password123:desarrollo
Funcionalidad:
- Lectura de configuración: Procesa cada línea del archivo
users_config.txt
. - Creación de grupos: Si el tipo es ‘grupo’, crea el grupo y añade los usuarios especificados.
- Creación de usuarios: Si el tipo es ‘usuario’, crea el usuario, lo asigna al grupo y establece la contraseña.
- Manejo de tipos: Soporta ‘grupo’ y ‘usuario’, con un mensaje para tipos no válidos.
#!/bin/bash
# Este script asume que el archivo 'users_config.txt' está en el mismo directorio
# y tiene el formato 'tipo:nombre:argumentos'
while IFS=: read -r tipo nombre argumentos; do
case "$tipo" in
"grupo")
# Eliminar espacios en blanco alrededor del nombre del grupo
grupo=$(echo "$nombre" | tr -d '[:space:]')
echo "Creando grupo '$grupo'"
# Verificar si el grupo ya existe antes de intentar crearlo
if ! getent group "$grupo" > /dev/null; then
sudo groupadd "$grupo"
else
echo "El grupo '$grupo' ya existe. Saltando creación."
fi
# Leer usuarios separados por coma y añadirlos al grupo
IFS=',' read -ra usuarios <<< "$argumentos"
for usuario in "${usuarios[@]}"; do
usuario=$(echo "$usuario" | tr -d '[:space:]') # Limpiar espacios del nombre de usuario
if [ -n "$usuario" ]; then # Asegurarse de que el nombre de usuario no esté vacío
echo "Añadiendo usuario '$usuario' al grupo '$grupo'"
# Verificar si el usuario existe antes de añadirlo al grupo
if id "$usuario" > /dev/null 2>&1; then
sudo usermod -a -G "$grupo" "$usuario"
else
echo "Advertencia: El usuario '$usuario' no existe. No se pudo añadir al grupo '$grupo'."
fi
fi
done
;;
"usuario")
# Eliminar espacios en blanco alrededor del nombre de usuario
usuario=$(echo "$nombre" | tr -d '[:space:]')
# Separar contraseña y grupo de los argumentos
read -r contrasenya grupo_usuario <<<"$argumentos"
grupo_usuario=$(echo "$grupo_usuario" | tr -d '[:space:]') # Limpiar espacios del nombre del grupo
echo "Creando usuario '$usuario'"
# Verificar si el usuario ya existe
if ! id "$usuario" > /dev/null 2>&1; then
# Crear el usuario, con directorio home (-m) y grupo principal (-g)
# Si el grupo_usuario es el grupo principal, usar -g. Si es un grupo secundario, usar -G.
# Para simplificar, asumimos que grupo_usuario es el grupo principal o uno secundario.
# useradd -m -g "$grupo_usuario" "$usuario" # Esto crea el usuario con grupo principal
# Para añadir a un grupo secundario, se usaría usermod después.
# Aquí se asume que el grupo_usuario es el grupo principal o se añade como secundario.
sudo useradd -m -G "$grupo_usuario" "$usuario"
echo "Usuario '$usuario' creado."
# Establecer contraseña
echo "$usuario:$contrasenya" | sudo chpasswd
echo "Contraseña establecida para '$usuario'."
else
echo "El usuario '$usuario' ya existe. Saltando creación."
# Si el usuario ya existe, se podría actualizar su grupo o contraseña si fuera necesario
# Por ejemplo, para añadirlo a un grupo secundario si no lo está:
# sudo usermod -a -G "$grupo_usuario" "$usuario"
# echo "Usuario '$usuario' añadido/confirmado en el grupo '$grupo_usuario'."
fi
;;
*)
echo "Tipo no válido: '$tipo'. Saltando línea."
;;
esac
done < users_config.txt
Fragmento de Código de Bajo Nivel / Ensamblador
Este pequeño fragmento de código parece ser parte de una rutina de inicio o un sistema embebido, posiblemente escrito en lenguaje ensamblador o un lenguaje de bajo nivel similar. Define puntos de salto y direcciones de memoria importantes.
Elementos clave:
JMP boot
: Salto a la rutina de inicio.JMP isr
: Salto al vector de interrupción.EQU
: Directiva para definir constantes o equivalencias de direcciones de memoria.sStackTop
,uStackTop
,txt_display
: Direcciones de memoria para la cima de la pila (de sistema y de usuario) y una dirección para la visualización de texto.
JMP boot
JMP isr ; Interrupt vector
sStackTop EQU 0x1FF
uStackTop EQU 0x2DF
txt_display EQU 0x2E0
Programación en Python
Script: Búsqueda de Cadena en Archivo
Este script en Python está diseñado para buscar una cadena específica dentro de un archivo de texto. Incluye validaciones robustas para asegurar que los argumentos sean correctos y que el archivo exista y no esté vacío.
Funcionalidad:
- Validación de argumentos: Comprueba que se proporcionen el nombre del archivo y la cadena a buscar.
- Manejo de archivos: Abre y lee el contenido del archivo de forma segura.
- Verificación de existencia y contenido: Asegura que el archivo exista y no esté vacío antes de la búsqueda.
- Búsqueda de cadena: Determina si la cadena se encuentra en el contenido del archivo.
- Manejo de errores: Captura y reporta errores comunes como archivo no encontrado o problemas de lectura.
import sys
import os # Importar os para os.path.exists y os.path.getsize
def buscar_cadena_en_archivo(archivo, cadena):
try:
with open(archivo, 'r') as f:
contenido = f.read()
if cadena in contenido:
print(f"La cadena '{cadena}' se encontró en el archivo '{archivo}'.")
else:
print(f"La cadena '{cadena}' no se encontró en el archivo '{archivo}'.")
except IOError:
print(f"Error: No se pudo abrir o leer el archivo '{archivo}'.")
def main():
if len(sys.argv) != 3:
print("Uso: python script.py <nombre_archivo> <cadena>")
return
archivo, cadena = sys.argv[1], sys.argv[2]
# Verificar si el archivo existe
if not os.path.exists(archivo):
print(f"Error: El archivo '{archivo}' no existe.")
return
# Verificar si el archivo está vacío
if os.path.getsize(archivo) == 0:
print(f"Error: El archivo '{archivo}' está vacío.")
return
# Si el archivo existe y no está vacío, proceder con la búsqueda
buscar_cadena_en_archivo(archivo, cadena)
if __name__ == "__main__":
main()