Introducción a Linux parte 2 ============================ Introducción a los Permisos en Linux ------------------------------------ Los permisos en Linux controlan el nivel de acceso que los usuarios y grupos tienen a los archivos y directorios. Existen tres tipos básicos de permisos: - **Lectura (r):** Permite leer el contenido del archivo o listar los archivos de un directorio. - **Escritura (w):** Permite modificar el archivo o añadir/eliminar archivos de un directorio. - **Ejecución (x):** Permite ejecutar el archivo como un programa o acceder al contenido de un directorio. Cada archivo y directorio en Linux tiene permisos definidos para tres tipos de usuarios: - **Propietario (user):** Generalmente el usuario que crea el archivo o directorio. - **Grupo (group):** Un conjunto de usuarios que pueden compartir ciertos permisos sobre el archivo o directorio. - **Otros (others):** Todos los demás usuarios que no son ni el propietario ni parte del grupo. Visualización de Permisos ^^^^^^^^^^^^^^^^^^^^^^^^^ El comando ``ls -l`` muestra una lista de archivos y directorios, incluyendo sus permisos, número de enlaces, propietario, grupo, tamaño, fecha de modificación y nombre. Los primeros 10 caracteres en la salida describen el tipo y los permisos del archivo: - El **primer carácter** indica el tipo de archivo: - ``-`` para archivos regulares. - ``d`` para directorios. - ``l`` para enlaces simbólicos, entre otros tipos especiales. - Los siguientes **nueve caracteres** se agrupan en tres conjuntos de tres, representando los permisos para el propietario (user), el grupo (group) y otros (others), en ese orden: - **r:** lectura (read). - **w:** escritura (write). - **x:** ejecución (execute). - **-:** indica que el permiso correspondiente no está asignado. Ejemplo de Salida de ``ls -l`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Para ilustrar cómo interpretar los permisos, considera el siguiente ejemplo de salida de ``ls -l``: .. code-block:: bash -rw-r--r-- 1 usuario grupo 4096 jul 28 14:00 ejemplo.txt En esta salida: - **``-rw-r--r--``**: Los permisos del archivo ``ejemplo.txt`` se desglosan de la siguiente manera: - El **primer carácter** es ``-``, indicando que es un archivo regular. - Los siguientes tres caracteres ``rw-`` muestran que el **propietario** tiene permisos de **lectura** y **escritura**, pero no de ejecución. - Los siguientes tres caracteres ``r--`` indican que el **grupo** solo tiene permiso de **lectura**. - Los últimos tres caracteres ``r--`` muestran que **otros** también tienen permiso de **lectura** únicamente. - **``1``**: Número de enlaces duros al archivo, lo que indica cuántos nombres tiene asignados en el sistema de archivos. - **``usuario``**: Nombre del propietario del archivo. - **``grupo``**: Nombre del grupo asignado al archivo. - **``4096``**: Tamaño del archivo en bytes. - **``jul 28 14:00``**: Fecha y hora de la última modificación. - **``ejemplo.txt``**: Nombre del archivo. Cambio de Permisos con ``chmod``: Entendiendo "ugoa" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ El comando ``chmod`` permite cambiar los permisos de archivos y directorios. La notación "ugoa" se refiere a quién se le aplican los cambios: - **u:** Propietario (user). - **g:** Grupo (group). - **o:** Otros (others). - **a:** Todos (all); es equivalente a "ugo" y permite aplicar el cambio a todos los usuarios simultáneamente. En la notación simbólica, se especifican los permisos con letras y símbolos: - **+** Agrega un permiso sin alterar los permisos existentes. - **-** Quita un permiso específico sin afectar los otros permisos establecidos. - **=** Establece los permisos exactos, sobrescribiendo los anteriores, eliminando cualquier otro permiso previamente configurado. Permisos en Formato Octal ^^^^^^^^^^^^^^^^^^^^^^^^^^ Otra forma de utilizar ``chmod`` es con la notación octal, en la cual los permisos se representan mediante números: - **4:** Lectura (r) - **2:** Escritura (w) - **1:** Ejecución (x) Cada grupo de permisos (propietario, grupo y otros) se expresa como una suma de estos valores. Por ejemplo: - **``chmod 755 archivo``**: Asigna permisos de lectura, escritura y ejecución al propietario (7 = 4+2+1), y permisos de lectura y ejecución para el grupo y otros (5 = 4+1). - **``chmod 644 archivo``**: Otorga permisos de lectura y escritura al propietario (6 = 4+2) y solo de lectura para el grupo y otros (4). Ejemplos de Uso ^^^^^^^^^^^^^^^ A continuación, se presentan algunos ejemplos prácticos del uso de ``chmod`` en notación simbólica y octal. Para agregar el permiso de ejecución al propietario y al grupo, pero quitarlo de otros: .. code-block:: bash chmod ug+x,o-x nombre_del_archivo Para establecer los permisos de lectura y escritura solo para el propietario, eliminando cualquier permiso para el grupo y otros: .. code-block:: bash chmod u=rw,go= nombre_del_archivo Para otorgar permisos completos al propietario, de solo lectura al grupo y ninguno a otros usando la notación octal: .. code-block:: bash chmod 740 nombre_del_archivo Ejercicio: Modificar Permisos con ``chmod`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Añade el permiso de ejecución para el grupo en un archivo. .. code-block:: bash chmod g+x nombre_del_archivo 2. Quita el permiso de escritura para otros. .. code-block:: bash chmod o-w nombre_del_archivo 3. Establece los permisos de un archivo para que solo el propietario tenga acceso total, mientras que el grupo y otros no tengan ningún permiso. .. code-block:: bash chmod 700 nombre_del_archivo 4. Usa la notación octal para otorgar permisos de lectura y escritura al propietario y permisos de lectura al grupo y otros. .. code-block:: bash chmod 644 nombre_del_archivo Este ejercicio te permitirá observar cómo ``chmod`` maneja los permisos de manera flexible y cómo se aplican las distintas notaciones simbólica y octal. Ejercicio: Configurar Acceso y Asegurar la Carpeta Home ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Este ejercicio te guiará para modificar los permisos de tu carpeta **home** para permitir acceso a otros usuarios, verificar que el cambio se haya realizado correctamente, y luego restaurar la seguridad de la carpeta. 1. **Permitir Acceso a Otros Usuarios**: Primero, cambia los permisos de tu carpeta home para permitir que otros usuarios puedan acceder a ella. .. code-block:: bash chmod o+rx /home/tu_usuario - **o+rx**: Este comando da permisos de lectura (r) y ejecución (x) a **otros** usuarios, permitiendo que puedan acceder a tu carpeta y listar su contenido. 2. **Verificar los Permisos Cambiados**: Para verificar que el cambio ha sido exitoso, accede a otro computador en la sala donde puedas iniciar sesión con una cuenta diferente (un usuario distinto al tuyo). - Desde la sesión de ese otro usuario, intenta acceder a tu carpeta **home** y listar su contenido utilizando el siguiente comando: .. code-block:: bash ls /home/tu_usuario - Si los permisos fueron aplicados correctamente, el otro usuario debería poder ver el contenido de tu carpeta **home**. Esto confirmará que los permisos de lectura y ejecución han sido otorgados a "otros" en tu carpeta. 3. **Restaurar Seguridad en la Carpeta Home**: Después de verificar que el acceso es funcional, asegúrate de que tu carpeta **home** esté protegida de accesos no autorizados. Quita los permisos otorgados a otros usuarios. .. code-block:: bash chmod o-rx /home/tu_usuario - **o-rx**: Este comando elimina los permisos de lectura y ejecución para otros, asegurando que solo el propietario (tú) y, posiblemente, el grupo tengan acceso a la carpeta. 4. **Verificar la Seguridad Restaurada**: Para comprobar que los permisos fueron restaurados, intenta listar el contenido de tu carpeta desde la cuenta del otro usuario. - Deberías recibir un mensaje de error indicando que el usuario no tiene permiso para acceder a la carpeta, confirmando que la carpeta está nuevamente segura. Este ejercicio te ayudará a entender cómo configurar permisos para permitir y restringir el acceso a tu carpeta **home**, asegurando la privacidad de tus archivos personales. Gestión de Procesos en Linux ---------------------------- Los procesos son instancias de programas en ejecución. La gestión de procesos implica monitorear y controlar los procesos activos en un sistema Linux. Listar Procesos con ``ps`` y ``top`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - **``ps``** muestra los procesos actuales. - **``top``** proporciona una vista dinámica de los procesos en ejecución, actualizando en tiempo real el uso de CPU y memoria. .. code-block:: bash ps -ef top Para salir de **``top``**, presiona la tecla **``q``**. Uso de ``htop`` ^^^^^^^^^^^^^^^ - **``htop``** es una herramienta interactiva avanzada que mejora ``top`` y ofrece una interfaz gráfica de línea de comandos con opciones de filtrado y navegación intuitiva. - Permite gestionar procesos de manera interactiva, facilitando tareas como el cambio de prioridad y el envío de señales de terminación. .. code-block:: bash htop Para salir de **``htop``**, presiona la tecla **``q``**. Enviar Señales con ``kill`` y ``pkill`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - **``kill``** envía señales a procesos específicos por su número de identificación de proceso (PID). - **``pkill``** permite enviar señales a procesos seleccionados por su nombre, simplificando la tarea cuando se desconoce el PID. Para obtener el **PID** (identificador de proceso) de un programa en ejecución, puedes usar los siguientes comandos: 1. **``ps``**: Lista los procesos actuales con sus respectivos PIDs. Puedes filtrar por el nombre del proceso para encontrarlo más fácilmente. .. code-block:: bash ps -ef | grep nombre_del_proceso - Esto mostrará el PID del proceso especificado (sustituye **``nombre_del_proceso``** por el nombre real del programa). 2. **``pgrep``**: Obtiene directamente el PID de un proceso dado su nombre. .. code-block:: bash pgrep nombre_del_proceso - Este comando devolverá el PID del proceso especificado si está en ejecución. Una vez que tengas el PID, puedes enviar señales con ``kill`` o ``pkill``: .. code-block:: bash kill -SIGTERM # Envía una señal al proceso usando su PID pkill -SIGTERM nombre_del_proceso # Envía una señal a todos los procesos con el nombre dado **Nota:** Ejecuta ``man signal`` para obtener una lista detallada de señales y sus efectos. Ejercicio 1: Listar Procesos ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Usa ``ps -ef`` para listar todos los procesos en el sistema y observa los detalles de cada proceso, como el usuario y el PID. 2. Usa ``top`` para monitorear los procesos en tiempo real, observando el uso de recursos del sistema. Ejercicio 2: Usar ``htop`` ^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Abre un editor de texto como **``nano``** en un terminal. 2. Desde un segundo terminal, ejecuta **``htop``** y localiza el proceso ``nano`` en la lista. 3. Termina (KILL) tu proceso ``nano`` desde ``htop`` seleccionando el proceso y usando la opción para enviar una señal de terminación. Ejercicio 3: Enviar Señales ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Abre un editor de texto como **``nano``** en un terminal. 2. Desde un segundo terminal, encuentra el PID de tu proceso ``nano`` usando ``ps`` y termina el proceso con ``kill``. - **Pregunta:** ¿Qué sucede si intentas matar un proceso ``nano`` que pertenece a otro usuario? - **Respuesta esperada:** Recibirás un mensaje de "Permiso denegado" debido a la falta de permisos, ya que los procesos son protegidos por el sistema y solo el propietario (o root) puede terminarlos. 3. Repite el paso 2 utilizando **``pkill``** en lugar de ``kill``. - **Pregunta:** ¿Qué sucede si tienes más de un proceso ``nano`` en ejecución y usas ``pkill``? - **Respuesta esperada:** ``pkill`` terminará todos los procesos con el nombre ``nano`` que pertenezcan al usuario actual. Si tienes múltiples instancias de ``nano`` abiertas, todas serán cerradas. Los ``nano`` de otros usuarios no se verán afectados. Manipulación Avanzada de Archivos y Directorios ----------------------------------------------- Búsqueda de Archivos con ``find`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``find`` es un potente comando que permite buscar archivos y directorios dentro de un árbol de directorios de acuerdo a diversos criterios, como el nombre, tipo de archivo, tamaño, propietario, permisos, y fechas de modificación o acceso. **Opciones Comunes de ``find``** - **``-type``**: Especifica el tipo de archivo a buscar. Los tipos más comunes son: - **``f``**: Archivos regulares. - **``d``**: Directorios. - **``-name``**: Busca archivos o directorios que coincidan con un patrón específico (usa comillas dobles para caracteres especiales, como ``*``). - **``-mtime``**: Busca archivos modificados en los últimos *n* días. Valores negativos indican archivos modificados en menos de *n* días. - **``-size``**: Filtra archivos según su tamaño. Puedes usar valores como ``+100k`` (mayores a 100 KB), ``-10M`` (menores a 10 MB), etc. **Ejemplos** - Buscar todos los archivos `.txt` en el directorio actual y sus subdirectorios: .. code-block:: bash find . -type f -name "*.txt" - Buscar todos los archivos `.conf` en la carpeta ``/etc/`` y sus subcarpetas: .. code-block:: bash find /etc/ -type f -name "*.conf" - Buscar todos los archivos en el directorio **home** que hayan sido modificados en el último día: .. code-block:: bash find ~ -mtime -1 - Buscar archivos mayores a 100 MB en el directorio actual y subdirectorios: .. code-block:: bash find . -type f -size +100M - Buscar directorios llamados ``backup`` en el sistema: .. code-block:: bash find / -type d -name "backup" - Buscar archivos con permisos específicos, como archivos con permisos ``777`` en el directorio actual: .. code-block:: bash find . -type f -perm 777 **Ejecutar Comandos en Archivos Encontrados** Puedes utilizar ``-exec`` para ejecutar comandos en cada archivo encontrado. Por ejemplo, para eliminar todos los archivos `.log` en el directorio actual y subdirectorios: .. code-block:: bash find . -type f -name "*.log" -exec rm {} \; **Nota**: Usa esta opción con precaución, especialmente si el comando ``rm`` está involucrado, ya que puede eliminar archivos sin confirmación. **Ejercicio: Búsqueda de Archivos** 1. Usa ``find`` para buscar todos los archivos `.pdf` en tu carpeta **home**. .. code-block:: bash find ~ -type f -name "*.pdf" 2. Encuentra todos los archivos en **/tmp** que hayan sido modificados en los últimos 7 días y anota sus rutas. .. code-block:: bash find /tmp -type f -mtime -7 3. Usa ``find`` para buscar todos los archivos mayores a 50 MB en tu **home** y redirige la salida a un archivo llamado ``archivos_grandes.txt``. .. code-block:: bash find ~ -type f -size +50M > archivos_grandes.txt Este ejercicio te ayudará a comprender la versatilidad de ``find`` para localizar archivos y gestionar tu sistema de manera más eficiente. Filtrado de Contenido con ``grep`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``grep`` es una herramienta útil para buscar coincidencias de patrones dentro de archivos, permitiendo localizar líneas específicas que contienen palabras o expresiones regulares. Además, ``grep`` ofrece varias opciones para ajustar la búsqueda, como ignorar mayúsculas o mostrar el número de línea donde se encuentra cada coincidencia. **Opciones Comunes de ``grep``** - **``-i``**: Ignora mayúsculas y minúsculas durante la búsqueda. - **``-r``**: Realiza una búsqueda recursiva en todos los archivos de un directorio y sus subdirectorios. - **``-c``**: Muestra solo el número de coincidencias encontradas en cada archivo. - **``-n``**: Muestra el número de línea donde se encuentra cada coincidencia. - **``-v``**: Invierte la búsqueda, mostrando solo las líneas que no contienen el patrón especificado. **Ejemplos** - Buscar la palabra "error" en todos los archivos `.log` contenidos en la carpeta ``/var/log``: .. code-block:: bash grep "error" /var/log/*.log - Contar el número de veces que aparece la palabra "error" en el archivo ``/var/log/dpkg.log``: .. code-block:: bash grep -c "error" /var/log/dpkg.log - Buscar la palabra "warning" en todos los archivos del directorio actual y sus subdirectorios, ignorando mayúsculas y minúsculas: .. code-block:: bash grep -ri "warning" . - Mostrar las líneas que contienen la palabra "failed" en el archivo ``/var/log/syslog`` junto con el número de línea correspondiente: .. code-block:: bash grep -n "failed" /var/log/syslog - Buscar todas las líneas en ``/etc/passwd`` que no contengan la palabra "root": .. code-block:: bash grep -v "root" /etc/passwd **Ejercicio: Filtrado de Contenido con ``grep``** 1. Usa ``grep`` para buscar la palabra "user" en todos los archivos de configuración de la carpeta **/etc** y muestra el número de línea de cada coincidencia. .. code-block:: bash grep -n "user" /etc/*.conf 2. Realiza una búsqueda recursiva de la palabra "critical" en el directorio **/var/log** e ignora mayúsculas y minúsculas. .. code-block:: bash grep -ri "critical" /var/log 3. Encuentra todas las líneas en el archivo **/etc/passwd** que no contengan la palabra "nologin" y redirige el resultado a un archivo llamado ``usuarios_activos.txt``. .. code-block:: bash grep -v "nologin" /etc/passwd > usuarios_activos.txt Este ejercicio te permitirá dominar el uso de ``grep`` para buscar patrones de texto en archivos y comprender cómo emplear sus opciones para refinar los resultados. Uso de los Comandos ``cp`` y ``mv`` ----------------------------------- Copiando Archivos y Directorios con ``cp`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ El comando ``cp`` se utiliza para copiar archivos y directorios de un lugar a otro. Algunas opciones adicionales permiten copiar los permisos y atributos de los archivos. **Opciones Comunes de ``cp``** - **``-r``**: Copia un directorio de manera recursiva, incluyendo todos los archivos y subdirectorios. - **``-i``**: Solicita confirmación antes de sobrescribir archivos en el destino. - **``-p``**: Preserva los atributos del archivo (como permisos, propietario y marcas de tiempo). - **``-v``**: Muestra un mensaje para cada archivo copiado, útil para seguimiento en copias grandes. **Ejemplos** - Copiar un archivo a otro directorio: .. code-block:: bash cp archivo_origen /ruta/al/directorio_destino - Copiar un directorio de manera recursiva: .. code-block:: bash cp -r directorio_origen /ruta/al/directorio_destino - Copiar un archivo y preservar sus atributos: .. code-block:: bash cp -p archivo_origen /ruta/al/directorio_destino Moviendo y Renombrando con ``mv`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ El comando ``mv`` puede mover archivos y directorios a otras ubicaciones, o renombrarlos si el destino está en el mismo directorio. Al mover archivos, ``mv`` también sobrescribirá archivos en el destino si ya existen, sin pedir confirmación a menos que se use la opción **``-i``**. **Opciones Comunes de ``mv``** - **``-i``**: Solicita confirmación antes de sobrescribir archivos en el destino. - **``-v``**: Muestra un mensaje para cada archivo o directorio movido. **Ejemplos** - Mover un archivo a otro directorio: .. code-block:: bash mv archivo_origen /ruta/al/directorio_destino - Renombrar un archivo en el mismo directorio: .. code-block:: bash mv archivo_origen nuevo_nombre Ejemplo Práctico ^^^^^^^^^^^^^^^^ Imagina que tienes un archivo llamado `reporte.txt` que deseas mover a un directorio llamado `Documentos` y luego renombrarlo a `reporte_final.txt`: 1. Mover el archivo al directorio **Documentos**: .. code-block:: bash mv reporte.txt ~/Documentos/ 2. Renombrar el archivo dentro del directorio **Documentos**: .. code-block:: bash mv ~/Documentos/reporte.txt ~/Documentos/reporte_final.txt **Copiar y Mover Múltiples Archivos** - Para copiar varios archivos al mismo directorio: .. code-block:: bash cp archivo1 archivo2 archivo3 /ruta/al/directorio_destino - Para mover múltiples archivos a un directorio específico: .. code-block:: bash mv archivo1 archivo2 archivo3 /ruta/al/directorio_destino Ejercicio: Uso de ``cp`` y ``mv`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Copia un archivo llamado ``informe.txt`` a un directorio llamado ``Respaldo``, preservando los permisos y atributos del archivo. .. code-block:: bash cp -p informe.txt ~/Respaldo/ 2. Mueve el archivo ``informe.txt`` al directorio ``Respaldo`` y luego renómbralo a ``informe_backup.txt``. .. code-block:: bash mv informe.txt ~/Respaldo/ mv ~/Respaldo/informe.txt ~/Respaldo/informe_backup.txt 3. Copia el contenido del directorio ``Proyectos`` a un nuevo directorio llamado ``Proyectos_Respaldo`` de forma recursiva, y verifica que los archivos se hayan copiado correctamente con ``ls``. .. code-block:: bash cp -r Proyectos Proyectos_Respaldo ls Proyectos_Respaldo Enlaces Simbólicos y Duros -------------------------- Introducción a Enlaces en Linux ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ En Linux, los enlaces son referencias que permiten acceder a archivos y directorios desde diferentes ubicaciones. Existen dos tipos principales de enlaces: - **Enlaces Duros**: Referencias directas a la ubicación física de los datos en el disco. - **Enlaces Simbólicos (Soft Links)**: Referencias a la ruta de un archivo o directorio, similares a accesos directos. Diferencias Clave ^^^^^^^^^^^^^^^^^ - **Enlaces Duros**: - No pueden cruzar sistemas de archivos; solo funcionan dentro del mismo sistema de archivos. - Solo pueden apuntar a archivos, no a directorios (excepto con permisos especiales de administrador). - Los enlaces duros son independientes del archivo original; si se borra el archivo original, el enlace duro sigue funcionando, ya que ambos comparten el mismo bloque de datos en el disco. - **Enlaces Simbólicos**: - Pueden apuntar a cualquier archivo o directorio, incluso si están en diferentes sistemas de archivos. - Si se borra el archivo o directorio original, el enlace simbólico se rompe y se convierte en un "enlace roto" que ya no apunta a datos válidos. - Almacenan solo la ruta del archivo o directorio objetivo, no los datos directamente, por lo que ocupan menos espacio en el disco. Creando Enlaces Duros ^^^^^^^^^^^^^^^^^^^^^ Para crear un enlace duro, utiliza el comando ``ln`` seguido del archivo original y el nombre del enlace: .. code-block:: bash ln archivo_original enlace_duro Ejemplo: .. code-block:: bash ln documento.txt copia_documento.txt En este ejemplo, tanto ``documento.txt`` como ``copia_documento.txt`` apuntan a los mismos datos en el disco. Cualquier cambio en uno de ellos se reflejará en el otro. Creando Enlaces Simbólicos ^^^^^^^^^^^^^^^^^^^^^^^^^^ Para crear un enlace simbólico, utiliza ``ln`` con la opción ``-s``: .. code-block:: bash ln -s archivo_original enlace_simbólico Ejemplo: .. code-block:: bash ln -s /path/to/documento.txt enlace_documento.txt En este caso, ``enlace_documento.txt`` solo apunta a la ruta ``/path/to/documento.txt``. Si ``documento.txt`` se elimina o se mueve, ``enlace_documento.txt`` ya no funcionará. Verificando Enlaces ^^^^^^^^^^^^^^^^^^^ - Usa el comando ``ls -l`` para verificar los enlaces. Un enlace simbólico se identificará con una flecha ``->`` que muestra el destino del enlace. - Los enlaces duros no tienen esta flecha, ya que son indistinguibles del archivo original en la salida de ``ls``. Ejercicio: Crear y Observar Enlaces ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Crea un enlace duro y un enlace simbólico a un archivo de tu elección en tu directorio **home**. .. code-block:: bash ln archivo.txt enlace_duro.txt ln -s archivo.txt enlace_simbólico.txt 2. Modifica el contenido del archivo original (por ejemplo, ``archivo.txt``) y observa cómo se refleja el cambio en ambos enlaces. .. code-block:: bash echo "Texto adicional" >> archivo.txt 3. Borra el archivo original y observa qué sucede con cada tipo de enlace: .. code-block:: bash rm archivo.txt - **Enlace duro**: El archivo ``enlace_duro.txt`` seguirá funcionando y contendrá los datos originales, ya que el enlace duro es una copia directa de los datos en el disco. - **Enlace simbólico**: El archivo ``enlace_simbólico.txt`` estará roto, y cualquier intento de acceso mostrará un error, ya que el enlace simbólico depende de la ruta del archivo original. Este ejercicio te ayudará a comprender las diferencias entre enlaces duros y simbólicos y a observar cómo se comportan en diferentes situaciones.