Skip to content
Jimmy Alvarez edited this page Jan 13, 2025 · 14 revisions

Práctica 3 (Unidad 3) - Sistemas Operativo I

Integrantes:

  • Yadira Nataly Merchan Cedillo
  • Jimmy Antonio Alvarez Molina

Resumen
En este Wiki de repositorio se documenta una práctica de administración de sistemas en un entorno Linux, específicamente en Ubuntu. Se desarrolló un script en Bash que permite gestionar usuarios y grupos, así como obtener información relevante sobre ellos. Además, se realizó la transferencia de un archivo de logs a un servidor remoto, seguido de un filtrado de datos utilizando herramientas como awk. Finalmente, se generó un archivo CSV que se puede abrir en Excel, facilitando la visualización de la información. Esta práctica proporciona una comprensión práctica de la gestión de usuarios y grupos en sistemas Linux, así como de la manipulación de datos en archivos de texto.

Abstract
In this Repository's Wiki presents a system administration practice in a Linux environment, specifically on Ubuntu. A Bash script was developed to manage users and groups, as well as to obtain relevant information about them. Additionally, a log file was transferred to a remote server, followed by data filtering using tools like awk. Finally, a CSV file was generated that can be opened in Excel, facilitating the visualization of the information. This practice provides a practical understanding of user and group management in Linux systems, as well as data manipulation in text files.


Introducción

La administración de sistemas es una disciplina esencial en el ámbito de la informática, especialmente en entornos basados en Linux. La capacidad de gestionar usuarios y grupos es fundamental para garantizar la seguridad y el control de acceso a los recursos del sistema. En este contexto, el uso de scripts en Bash se convierte en una herramienta poderosa que permite automatizar tareas repetitivas y simplificar la administración del sistema. Bash, que es un acrónimo de "Bourne Again SHell", es un intérprete de comandos que proporciona un entorno de línea de comandos para interactuar con el sistema operativo. A través de scripts en Bash, los administradores pueden ejecutar una serie de comandos de manera secuencial, lo que facilita la gestión de usuarios, la configuración del sistema y la manipulación de archivos.

Una de las herramientas más versátiles y potentes disponibles en el entorno Unix/Linux es awk. Esta herramienta de procesamiento de texto permite realizar análisis y transformaciones de datos de manera eficiente. awk es un lenguaje de programación diseñado para la manipulación de datos en archivos de texto, lo que lo convierte en una opción ideal para filtrar, formatear y extraer información relevante de grandes volúmenes de datos. Su capacidad para trabajar con patrones y expresiones regulares permite a los usuarios realizar tareas complejas de manera sencilla y concisa. En esta práctica, se utilizará awk para filtrar datos de un archivo de logs, extrayendo información única sobre usuarios, eventos y direcciones IP.

El objetivo de esta práctica es desarrollar un script en Bash que no solo gestione usuarios y grupos en un sistema Linux, sino que también integre la manipulación de datos utilizando awk. A través de un menú interactivo, el script permitirá a los usuarios listar, validar y obtener información sobre usuarios y grupos existentes. Además, se explorará la transferencia de archivos a un servidor remoto y la generación de informes en formato CSV, lo que facilitará la visualización de datos en herramientas como Microsoft Excel.

En resumen, esta práctica no solo proporciona una comprensión práctica de la gestión de usuarios y grupos en sistemas Linux, sino que también destaca la importancia de las herramientas de scripting y procesamiento de datos en la administración de sistemas. Al finalizar, se espera que los participantes adquieran habilidades valiosas que les permitan optimizar sus tareas administrativas y mejorar su eficiencia en el manejo de sistemas Linux.


Objetivo General

  • Desarrollar un script en Bash que permita gestionar usuarios y grupos en un sistema Linux, así como manipular y filtrar datos de archivos de logs, facilitando la administración y visualización de la información.

Objetivos Específicos

  • Implementar un menú interactivo en Bash que permita listar usuarios y grupos existentes en el sistema.
  • Validar la existencia de usuarios y grupos antes de realizar operaciones sobre ellos.
  • Transferir un archivo de logs a un servidor remoto utilizando SCP.
  • Filtrar datos del archivo de logs para obtener información única sobre usuarios, eventos y direcciones IP.
  • Generar un archivo CSV a partir de los datos filtrados, que sea compatible con Excel.

Desarrollo

Paso 1: Creamos el archivo del script

  • Ya dentro de nuestra distribución de Ubuntu, abrimos el terminal y creamos un nuevo archivo sh:
sudo touch alvarez.sh

Una vez creado el archivo, entramos para editarlo ya sea con nano o con vim. En nuestro caso usamos vim para tener una gestión de los códigos y los comandos más detallada y profesional.

sudo vim alvarez.sh

Paso 2: Escribimos el script en el archivo sh

Una vez dentro del archivo empezamos con la primera línea de inicio.

1. Ejecución del archivo bajo bash:

Empezando con la primera línea de código, indicamos al script que debe de ejecutarse con el interpréte de bash:

#!/bin/bash

2. Sección para listar los usuarios:

En esta primera sección, usamos la función listar_usuarios el cual imprime un encabezado que indica que se mostrarán los usuarios existentes en el sistema. Luego, utilizamos el comando cut para extraer y mostrar el primer campo (nombre de usuario) del archivo /etc/passwd, que contiene información sobre todos los usuarios del sistema.

listar_usuarios() {
	echo "Usuarios existentes en el sistema de Ubuntu:"
	cut -d: -f1 /etc/passwd
}

3. Sección para listar los grupos:

En esta siguiente sección, hacemos uso de la función listar_grupos, que imprime un encabezado que indica que se mostrarán los grupos existentes en el sistema. Al igual que en la función anterior, utilizamos la herramienta cut para extraer y mostrar el primer campo (nombre del grupo) del archivo /etc/group, que contiene información sobre todos los grupos del sistema:

listar_grupos() {
	echo "Grupos existentes en el sistema de Ubuntu:"
	cut -d: -f1 /etc/group
}

4. Sección para listar los terminales existentes:

En esta opción, usamos la función listar_terminales el cual muestra un encabezado que indica que se mostrarán las terminales disponibles en el sistema. Aquí utilizamos el comando who -T para listar los usuarios conectados y sus terminales. Luego, awk se usa para extraer los primeros tres campos (nombre de usuario, terminal y tiempo de conexión), y con sort y uniq slo utilizamos en esta lógica para ordenar y eliminar duplicados, mostrando así una lista única de terminales.

listar_terminales() {
	echo "Terminales disponibles en el sistema:"
	who -T | awk '{print $1, $2, $3}' | sort | uniq
}

5. Sección para mostrar los grupos de un usuario:

La función grupos_de_usuario solicita al usuario que ingrese un nombre de usuario. Luego, verifica si el usuario existe utilizando id. Si el usuario existe, ordanamos al script que imprima los grupos a los que pertenece utilizando el comando groups. Si el usuario no existe, se muestra un mensaje de error.:

grupos_de_usuario() {
	read -p "Ingrese el nombre del usuario: "  usuario
	if id "$usuario" &>/dev/null; then
		echo "Grupos a los que pertenece el usuario $usuario:"
		groups "$usuario"
	else
		echo "Error: el usuario '$usuario' no existe."
	fi
}

6. Sección para mostrar los usuarios de un grupo:

Pedimos al script a través de la función usuarios_de_grupo solicita al usuario que ingrese el nombre de un grupo. Luego, verifica si el grupo existe utilizando getent group. Si el grupo existe, imprime los usuarios que pertenecen a ese grupo, extrayendo el cuarto campo de la entrada del grupo (que contiene los nombres de los usuarios) con cut. Si el grupo no existe, muestra un mensaje de error. que muestre los usarios de un grupo, de tal manera que cuando ingeresemos el nombre de cualquier grupo existente en el sistema, este pueda enlistar todos los usuarios que pertenezcan a este grupo.

usuarios_de_grupo() {
	read -p "Ingrese el nombre del grupo: " grupo
	if getent group "$grupo" &>/dev/null; then
		echo "Usuarios del grupo $grupo:"
		getent group "$grupo" | cut -d: -f4
	else
		echo "Error: El grupo '$grupo' no existe."
	fi
}

7. Sección para mostrar la información de un usuario:

En esta última opción para el menú, creamos la función info_usuario, que nos permita ingresar un nombre de usuario y, si este existe en el sistema, muestra información relevante sobre él, incluyendo los grupos a los que pertenece, la terminal en la que está conectado, su UID y la información de su contraseña. con id

info_usuario() {
	read -p "Ingrese el nombre del usuario: " usuario
	if id "$usuario" &>/dev/null; then
		echo "Información del usuario $usuario:"
		echo "Grupos: $(groups "$usuario"):"
		echo "Terminal: $(who | grep "$usuario" | awk '{print $2}')"
		echo "Permisos: $(getent passwd "$usuario" | cut -d: -f3)"
		echo "Contraseña: $(getent shadow "$usuario"  | cut -d: -f2)"
	else
		echo "Error: El usuario '$usuario' no existe."
	fi
}

Si el usuario no existe, se muestra un mensaje de error. Esta función es útil para la administración de sistemas, ya que proporciona una forma rápida de obtener información sobre los usuarios del sistema.

Note

Al momento de solicitar la información de cualquier usuario existente, la contraseña se mostrará codificado bajo reglas de criptografía por medidas de seguridad.

8. Sección del menú principal:

  • Primera línea, Bublcle infinito: Para completar el script, empezamos con una línea de condicional while, que se ejecutará indefinidamente (true siempre es verdadero). Esto permite que el menú se muestre repetidamente hasta que decidamos salir.
while true; do
  • Muestra de opciones: Estas líneas imprimen en la terminal de shell las opciones disponibles para el usuario que ejecute el .sh. Cada opción corresponde a una función específica del script, permitiendonos elegir qué acción deseamps realizar.
echo "Seleccione una opción:"
	echo "1. Listar usuarios existentes"
	echo "2. Listar grupos existentes"
	echo "3. Listar terminales disponibles"
	echo "4. Mostrar grupos de un usuario"
	echo "5. Mostrar usuarios de un grupo"
	echo "6. Mostrar información de un usuario"
	echo "7. Salir"
  • Lectura de opción del usuario: Esta línea utiliza el comando read para solicitarnos que ingresemos la opción que queramos ejecutar. El valor ingresado se almacena en la variable opcion.
read -p "Opción: " opcion
  • Estructura de control: Esta línea inicia una estructura case que evalúa el valor de la variable opcion. Dependiendo del valor ingresado, se ejecutará un bloque de código específico.
	case $opcion in
  • Ejecución de las funciones: Cada línea dentro del bloque case corresponde a una opción del Menú del script. Si procedemos a ingresar un número del 1 al 6, se llama a la función correspondiente:
1) listar_usuarios ;;
		2) listar_grupos ;;
		3) listar_terminales ;;
		4) grupos_de_usuario ;;
		5) usuarios_de_grupo ;;
		6) info_usuario ;;
		7) echo "Saliendo..."; exit 0 ;;
  • listar_usuarios: Lista los usuarios existentes.

  • listar_grupos: Lista los grupos existentes.

  • listar_terminales: Lista las terminales disponibles.

  • grupos_de_usuario: Muestra los grupos a los que pertenece un usuario.

  • usuarios_de_grupo: Muestra los usuarios de un grupo.

  • info_usuario: Muestra información detallada sobre un usuario.

  • Opción de "Salida": Si aquí en esta opción ingresamos 7, se imprime un mensaje de despedida y a lo que utilicemos exit 0 se ejecuta la instrucción de salir del script de manera exitosa.

*) echo "Opción no válida. Intente de nuevo." ;;
  • Manejo de errores: Esta línea se ejecuta si el uingresamos una opción que no está en el rango del 1 al 7. El script procede a imprimir un mensaje indicando que la opción no es válida y nos solicita que intentemos de nuevo.
*) echo "Opción no válida. Intente de nuevo." ;;
  • Líneado en blanco y fin del bucle: echo "" imprime una línea en blanco para mejorar la legibilidad de la salida en la terminal. La palabra clave done indica el final del bucle while, lo que significa que el Menú se volverá a mostrar y podremos seleccionar otra opción.
esac
	echo ""
done

Reseña general
La sección del Menú principal del script proporciona una interfaz interactiva para que podamos seleccionar diferentes opciones relacionadas con la gestión de usuarios y grupos en un sistema Linux. Este utiliza un bucle infinito para mostrar el menú repetidamente, permitiendonos realizar múltiples acciones sin necesidad de reiniciar el script. La estructura case se utiliza para manejar las diferentes opciones, llamando a las funciones correspondientes según la elección del usuario. Además, incluye un manejo de errores para asegurar que a lo que ingresemos opciones válidas y una opción para salir del script de manera controlada. Esta estructura hace que el script sea fácil de usar y eficiente para la administración del sistema.

  • 9. Contenido de todas las secciones recopilado del script:
#!/bin/bash


# Sección para listar los usarios
listar_usuarios() {
	echo "Usuarios existentes en el sistema de Ubuntu:"
	cut -d: -f1 /etc/passwd
}


# Sección para listar los grupos
listar_grupos() {
	echo "Grupos existentes en el sistema de Ubuntu:"
	cut -d: -f1 /etc/group
}


# Sección para lisar los terminales existentes
listar_terminales() {
	echo "Terminales disponibles en el sistema:"
	who -T | awk '{print $1, $2, $3}' | sort | uniq
}


# Sección para mostrar los grupos de un usuario
grupos_de_usuario() {
	read -p "Ingrese el nombre del usuario: "  usuario
	if id "$usuario" &>/dev/null; then
		echo "Grupos a los que pertenece el usuario $usuario:"
		groups "$usuario"
	else
		echo "Error: el usuario '$usuario' no existe."
	fi
}


# Sección para mostrar usuario de un grupo
usuarios_de_grupo() {
	read -p "Ingrese el nombre del grupo: " grupo
	if getent group "$grupo" &>/dev/null; then
		echo "Usuarios del grupo $grupo:"
		getent group "$grupo" | cut -d: -f4
	else
		echo "Error: El grupo '$grupo' no existe."
	fi
}

	       
# Sección para monstrar la información de un usuario
info_usuario() {
	read -p "Ingrese el nombre del usuario: " usuario
	if id "$usuario" &>/dev/null; then
		echo "Información del usuario $usuario:"
		echo "Grupos: $(groups "$usuario"):"
		echo "Terminal: $(who | grep "$usuario" | awk '{print $2}')"
		echo "Permisos: $(getent passwd "$usuario" | cut -d: -f3)"
		echo "Contraseña: $(getent shadow "$usuario"  | cut -d: -f2)"
	else
		echo "Error: El usuario '$usuario' no existe."
	fi
}

# Sección del Menú Principal
while true; do
	echo "Seleccione una opción:"
	echo "1. Listar usuarios existentes"
	echo "2. Listar grupos existentes"
	echo "3. Listar terminales disponibles"
	echo "4. Mostrar grupos de un usuario"
	echo "5. Mostrar usuarios de un grupo"
	echo "6. Mostrar información de un usuario"
	echo "7. Salir"
	read -p "Opción: " opcion

	case $opcion in
		1) listar_usuarios ;;
		2) listar_grupos ;;
		3) listar_terminales ;;
		4) grupos_de_usuario ;;
		5) usuarios_de_grupo ;;
		6) info_usuario ;;
		7) echo "Saliendo..."; exit 0 ;;
		*) echo "Opción no válida. Intente de nuevo." ;;
	esac
	echo ""
done

10. Ejecución del script como programa y prueba de funcionalidad

  • Con el comando ./alvarez.sh ejecutamos el archivo como programa:

capture_15

  • Elegimos la opción 3 Terminales disponibles en el sistema:

capture_16

  • Como último paso de verificación de funcionalidad, probamos con la opción 5, Mostrar información de un usuario:

capture_17

Note

Notemos que el usuario arroja la información de la contraseña del usuario de manera criptográfica por medidas de seguridad.


Paso 3: Gestión de logs

1. Verificamos que el archivo logs_01SO01-2025.csv esté en MobaXterm:

  • Abrimos MobaXterm y nos conectamos al servidor.
  • Navegamos hasta el directorio donde debería estar el archivo logs_01SO01-2025.csv.

capture_1

2. Creación de un script de búsqueda de usuarios y eventos

  • Se creó un archivo de script llamado "busqueda_USUARIO.sh" utilizando el editor nano. Este script nos permite buscar información de eventos y horarios asociados a un usuario ingresado.

capture_2 capture_3

  • Comandos para crear el archivo:
nano busqueda_USUARIO.sh

capture_3

#!/bin/bash

while true; do
  echo "Seleccione una de las opciones:"
  echo "1. Buscar Usuario"
  echo "2. Salir"
  read -p "Opción: " option

  case $option in
    1)
      read -p "Ingrese el nombre completo del usuario: " user
      echo "Buscando usuario: $user"  # Agregar esta línea para depuración
      if grep -i "$user" logs_01SO01-2025.csv; then  # Cambiar el nombre del archivo aquí
        echo "Mostrando eventos y horas para el usuario: $user"
        awk -F ',' -v user="$user" '$2 ~ user {OFS=" - "; gsub(/"/, "", $2); print $6 " ; " $1}' logs_01SO01-2025.CSV | sort | uniq
      else
        echo "Error: El usuario $user no existe en el registro."
      fi
      ;;
    2)
      echo "Finalizando todo..."
      break
      ;;
    *)
      echo "Opción no válida. Intente de nuevo."
      ;;
  esac
done

Este script es útil para la administración de logs, permitiendo a los usuarios buscar y visualizar información relevante de manera eficiente.

  • Luego, a este archivo .sh se le otorgó permisos de ejecución para que el script pueda ejecutarse como un programa sin ningun problema.

capture_4

Comando usado:\

chmod +x busqueda_USUARIO.sh
  • Se ejecuta luego el script usando el siguiente comando para verificar que estuviera funcionando correctamente:
./busqueda_USUARIO.sh

capture_5

Luego de la ejecución, se puede visualizar las opciones y en este caso seleccionamos la opción 1 para buscar un usuario y se ingresó el nombre de un usuario.

3. Filtrado de información en el archivo .cvs principal\

  • Se utilizó el comando awk para extraer información específica sobre el nombre de usuario, el evento realizado y la dirección IP. Los resultados fueron organizados y guardados en un archivo .csv que contiene los datos deseados:

capture_6

awk -F ',' '{print $2, $6, $9}' ~/logs_2025.csv | sort | uniq | sed 's/"//g'

awk -F ',': Define el delimitador de campo como coma.
{print , , }: Imprime los campos 2 (nombre de usuario), 6 (nombre del evento), y 9 (dirección IP).
sort | uniq: Ordena y elimina entradas duplicadas.
sed 's/"//g': Elimina las comillas dobles de los resultados.

Este comando filtra y organiza los datos del archivo logs_2025.csv.

4. Creación de archivos cvs específicos para usuarios

  • Se utilizó el comando awk para generar archivos cvs específicos para los usuarios JIMMY ANTONIO ALVAREZ MOLINA y YADIRA NATALY MERCHAN CEDILLO. La información de eventos y tiempos (fechas y horas) se extrajo y se guardó en archivos individuales para cada usuario.

Comando para JIMMY ANTONIO ALVAREZ MOLINA:

awk -F ',' '$2 ~ / JIMMY ANTONIO ALVAREZ MOLINA / {gsub(/"/, ""); print $6 " ; "$1}' logs_2025.csv > JIMMY ANTONIO ALVAREZ MOLINA _10_01_2025.csv

capture_7

Comando para YADIRA NATALY MERCHAN CEDILLO:

awk -F ',' '$2 ~ / YADIRA NATALY MERCHAN CEDILLO / {gsub(/"/, ""); print $6 " ; "$1}' logs_2025.csv > YADIRA NATALY MERCHAN CEDILLO _10_01_2025.csv

capture_8

awk -F ',': Define el delimitador de campo como coma.
~ / JIMMY ANTONIO ALVAREZ MOLINA /: Filtra las líneas que contienen el nombre de usuario específico.
{gsub(/"/, ""); print " ; "}: Elimina las comillas dobles y luego imprime el nombre del evento y la fecha y hora.
Los resultados se guardan en archivos CSV correspondientes a cada usuario.

capture_9

4. Verificación de archivos generados

  • Se verificaron los archivos generados usando el editor de texto nano para confirmar que la información fue extraída correctamente:

Comando:\

nano YADIRA NATALY MERCHAN CEDILLO _10_01_2025.csv

capture_10

Comando para verificar en nano para el otro archivo:

nano JIMMY ANTONIO ALVAREZ MOLINA _10_01_2025.csv

capture_11

  • Se transfirieron los archivos csv a Windows usando MobaXterm para abrirlos con excel y confirmar la correcta extracción y formato de los datos:

capture_12\

capture_13

5. Verificación en excel

  • Los archivos generados fueron transferidos a la máquina con Windows usando MobaXterm.\
  • Una vez en Windows, los archivos fueron abiertos con Excel para asegurarse de que los datos fueran legibles y organizados correctamente.

capture_14


Conclusiones

La práctica realizada permitió adquirir habilidades en la administración de usuarios y grupos en un sistema Linux. El desarrollo del script en Bash demostró ser una herramienta efectiva para gestionar información de manera eficiente. Además, la transferencia de archivos y el filtrado de datos tilizando awk proporcionaron una comprensión más profunda de cómo manipular datos en archivos de texto. La generación de un archivo CSV compatible con Excel facilitó la visualización de la información, lo que es crucial para la toma de decisiones informadas en la administración de sistemas.

Recomendaciones

  • Continuar practicando la administración de sistemas en entornos Linux para fortalecer las habilidades adquiridas.
  • Explorar otras herramientas y lenguajes de scripting que puedan complementar el uso de Bash, como Python o Perl.
  • Implementar medidas de seguridad adicionales al gestionar usuarios y grupos, como la auditoría de accesos y la gestión de permisos.
  • Realizar copias de seguridad periódicas de los archivos de logs y otros datos importantes para evitar la pérdida de información.

Referencias Bibliográficas