Configuración de variables de entorno y personalización del shell

Objetivo:

Comprender el funcionamiento de las variables de entorno en sistemas Linux, diferenciar entre su ámbito local y global, y aprender a persistir configuraciones personalizadas y modificaciones en la variable PATH utilizando los ficheros de inicialización del shell (.bashrc, /etc/profile).

Escenario:

  • Herramientas: Terminal Linux, comandos export, echo, printenv, source, y editores de texto.
  • Conceptos analizados: Variables de entorno vs. variables locales, jerarquía de ficheros de configuración del shell (archivos de inicio y de login), y la variable del sistema PATH.
  • Proceso clave: Creación de un script personalizado en un directorio dedicado, inclusión de dicha ruta en el PATH de forma persistente, y configuración de variables globales y de usuario.

Escenario Real: Automatización y accesibilidad de scripts de administración

Como administrador de sistemas, has desarrollado una serie de scripts propios de mantenimiento que guardas en la carpeta /opt/scripts_admin. Cada vez que necesitas ejecutarlos, te ves obligado a escribir la ruta completa o moverte de directorio, lo cual es ineficiente y propenso a errores. Tu objetivo es configurar el sistema para que estos scripts se puedan ejecutar desde cualquier ubicación escribiendo únicamente su nombre, al igual que cualquier comando nativo del sistema.

Por defecto, el shell busca los ejecutables en las rutas especificadas en la variable de entorno PATH. Cuando un comando no se encuentra en esas rutas, el sistema devuelve un error de tipo "command not found". Modificar adecuadamente los ficheros de configuración como .bashrc o /etc/profile permite extender este comportamiento de forma persistente y segura.

NOTA: Para realizar esta práctica con total seguridad, trabajaremos sobre tu usuario habitual o un entorno de prácticas, evitando modificar ficheros globales del sistema de forma incorrecta que puedan comprometer el inicio de sesión general.

Instrucciones:

Fase 1: Análisis de variables de entorno y del PATH actual:

  • Visualizar todas las variables de entorno actuales de la sesión: printenv
  • Consultar el valor específico de la variable PATH: echo $PATH
  • Crear una variable local de prueba y comprobar su comportamiento: MI_VARIABLE="Hola FP" y luego echo $MI_VARIABLE
  • Abrir una nueva pestaña de la terminal y comprobar si la variable local sigue existiendo (reflexionar sobre el resultado).

Fase 2: Creación de un script ejecutable y directorio personalizado:

  • Crear un directorio dedicado para herramientas de administración: sudo mkdir -p /opt/scripts_admin
  • Asignar permisos y propietario adecuados (ej. tu usuario actual): sudo chown -R $USER:$USER /opt/scripts_admin
  • Crear un script simple de prueba dentro de la carpeta: nano /opt/scripts_admin/mantenimiento.sh
  • Añadir el siguiente contenido al script:
    #!/bin/bash
    echo "Ejecutando tarea de mantenimiento del sistema..."
    echo "Fecha actual: $(date)"
    
  • Guardar el fichero y otorgarle permisos de ejecución: chmod +x /opt/scripts_admin/mantenimiento.sh
  • Intentar ejecutar el script escribiendo únicamente mantenimiento.sh desde tu directorio personal (comprobar el error devuelto).

Fase 3: Modificación temporal y persistente de la variable PATH:

  • Añadir temporalmente la nueva ruta al PATH en la sesión actual: export PATH=$PATH:/opt/scripts_admin
  • Probar ahora a ejecutar el comando desde cualquier ubicación: mantenimiento.sh
  • Comprobar que al abrir una nueva terminal, el cambio se ha perdido (demostración de la volatilización de export directo).
  • Hacer el cambio permanente para tu usuario editando el fichero de configuración del shell: nano ~/.bashrc
  • Desplazarte al final del fichero y añadir la línea de exportación: export PATH=$PATH:/opt/scripts_admin
  • Guardar los cambios y recargar el fichero de configuración para aplicar los cambios sin reiniciar: source ~/.bashrc

Fase 4: Configuración de variables de entorno globales en /etc/profile:

  • Abrir el fichero de configuración global de entorno para todos los usuarios: sudo nano /etc/profile
  • Añadir una variable de entorno corporativa al final del archivo, por ejemplo: export ENTORNO_PRODUCCION="false"
  • Guardar los cambios y cerrar el editor.
  • Verificar que la nueva variable global está disponible abriendo una nueva sesión de shell o cargando el perfil: source /etc/profile y luego echo $ENTORNO_PRODUCCION.

Verificación:

  • Comprobar que la ruta /opt/scripts_admin aparece correctamente reflejada al imprimir el PATH: echo $PATH
  • Ejecutar el script desde un directorio totalmente aleatorio (ej. cd /tmp) invocando directamente: mantenimiento.sh
  • Verificar que la variable global creada en /etc/profile es accesible para el usuario.

Posibles errores y resolución de problemas:

Si tras modificar el fichero ~/.bashrc o /etc/profile los cambios no surten efecto o el comando sigue sin encontrarse, suele deberse a que no se ha recargado el archivo de configuración en la sesión actual.

  • Solución: Ejecuta source ~/.bashrc (o cierra y vuelve a abrir la terminal completamente) para forzar al intérprete de comandos a leer de nuevo las instrucciones de inicialización.

Alternativa directa: Comprobación de directorios en el PATH

Si tienes dudas sobre qué directorios están actualmente integrados en la ruta de ejecución y quieres listarlos de forma limpia uno debajo de otro para revisarlos detalladamente, puedes usar el siguiente comando basado en tr:

echo $PATH | tr ':' '\n'

Preguntas de reflexión:

  1. ¿Qué diferencia principal existe entre definir una variable de entorno mediante export VARIABLE=valor frente a una variable local de shell VARIABLE=valor?
  2. ¿Por qué es un riesgo de seguridad o una mala práctica añadir rutas no controladas o directorios actuales (.) al principio de la variable PATH?
  3. ¿Qué diferencia hay entre los ficheros de configuración orientados a shells de login (como /etc/profile) y los orientados a shells interactivos no de login (como ~/.bashrc)?
  4. ¿Qué utilidad aporta utilizar el comando source tras modificar un fichero de configuración en lugar de cerrar y abrir la terminal?
Haz clic aquí para ver las soluciones y explicaciones

1. ¿Qué diferencia principal existe entre definir una variable de entorno mediante export VARIABLE=valor frente a una variable local de shell VARIABLE=valor?

Una variable local de shell solo está disponible en la sesión o proceso de terminal actual y no se hereda por los subprocesos o scripts ejecutados desde ella. Al utilizar export, la variable se convierte en variable de entorno, lo que permite que sea heredada y visible por cualquier programa o script hijo que se ejecute en ese mismo entorno.


2. ¿Por qué es un riesgo de seguridad o una mala práctica añadir rutas no controladas o directorios actuales (.) al principio de la variable PATH?

Si el directorio actual o una ruta insegura está al principio del PATH, un atacante que logre colocar un archivo ejecutable malicioso con el mismo nombre que un comando legítimo (por ejemplo, ls o sudo) en ese directorio conseguirá que el sistema ejecute su código malicioso en lugar de la utilidad del sistema cuando el usuario invoque dicho comando.


3. ¿Qué diferencia hay entre los ficheros de configuración orientados a shells de login (como /etc/profile) y los orientados a shells interactivos no de login (como ~/.bashrc)?

Los ficheros de login (como /etc/profile o ~/.profile) se ejecutan una única vez cuando el usuario inicia sesión en el sistema (por ejemplo, tras autenticarse en una TTY o por SSH). Los ficheros interactivos no de login (como ~/.bashrc) se ejecutan cada vez que se abre una nueva pestaña o ventana de terminal dentro de una sesión ya iniciada.


4. ¿Qué utilidad aporta utilizar el comando source tras modificar un fichero de configuración en lugar de cerrar y abrir la terminal?

El comando source (o el punto .) fuerza al intérprete de comandos actual a leer y ejecutar de inmediato las instrucciones contenidas en el fichero de configuración, aplicando los cambios al entorno al vuelo sin necesidad de interrumpir el flujo de trabajo cerrando y abriendo una nueva ventana de terminal.