Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

martes, 24 de noviembre de 2015

La pesadilla del comando rm en Linux

El borrado de archivos en Linux puede ser desde una tarea muy simple y segura, hasta una catastrofe dependiendo del método usado para borrar archivos o del entorno en el que se esté trabajando; ¿Cuantas veces nos hemos echado las manos a la cabeza por borrar algo que no debíamos? A mí la primera vez casi me dio un ataque, pero de los errores se aprende y uno debe de buscar métodos para evitar desastres y evitar el tener que recurrir a herramientas de terceros para intentar recuperar lo eliminado. El eliminar un archivo en un entorno de escritorio (es decir, en un entorno gráfico) no supone un problema en sí mismo, pues todos los entornos poseen de una papelera que generalmente se guarda en la carpeta personal del usuario; su ruta sería generalmente ~/.local/share/Trash y su funcionamiento se asemejaría bastante con el de la papelera de Windows, pues existe un icono parecido que puede gestionarse con la misma facilidad y podemos acceder a esa ruta desde la consola si nos sentimos más comodos. El problema viene cuando recurrimos al comando rm...

rm_portada

Rm, aunque no elimina por completo la información del disco duro y puede ser recuperado con "facilidad" mediante herramientas especiales, hace que la recuperación de un archivo sea laboriosa y no siempre exitosa, cosa que no tendría que ser así. Para prevenir este tipo de sustos, podemos recurrir a uno de los siguientes métodos.


Método 1: Mediante la herramienta trash-cli

Admito que esta opción no es mi favorita, pero es interesante conocer su existencia.  Respeta la misma filosofía que la que se usa en el entorno de escritorio, manteniendo todo debidamente estandarizado... Por contra esta herramienta requiere eliminar el habito de usar el comando rm; un habito que, personalmente se me hace difícil de quitar, y siempre se le puede a uno escapar un comando rm cuando no debe... El factor humano es el más peligroso de todos... Esto no le resta utilidad a esta herramienta, y por ello lo veremos a continuación.

Para empezar, esta herramienta no está instalada por defecto en el sistema operativo, aunque puede ser instalada fácilmente con los repositorios, así que para disfrutar de esta utilidad tendremos que escribir:

apt-get install trash-cli

La instalación en un principio parece que no ha hecho nada especial, y en un principio no veremos cambios especiales ni "papeleras de reciclaje". De lo que sí que dispondremos será de de la utilidad trash, que posee el siguiente funcionamiento:

Comenzaríamos con lo más básico y fundamental; la eliminación del archivo. Aquí el concepto no es denominado borrar el archivo, sino desplazarlo a una "papelera" alojada en la ubicación ~/.local/share/Trash tal y como se hace en un entorno gráfico. Esto se logra mediante el comando trash-put, seguido del nombre del fichero a eliminar... Con lo que si deseasemos eliminar el fichero importante.txt, escribiríamos:

trash-put importante.txt

Esto tiraría a la papelera el archivo seleccionado, papelera cuyo contenido podríamos consultar mediante el comando:

trash-list

En dicho listado observaríamos el nombre del archivo y además también la fecha y hora en la que  se "borró" éste.

Obviamente podemos eliminar elementos de la papelera, ya sea de forma individual o global... Por ejemplo para borrar un único archivo individual, como por ejemplo importante.txt escribiríamos:

trash-rm importante.txt

Mientras que para un vaciado completo el comando sería más simple escribir:

trash-empty

Todo lo enviado a la papelera de reciclaje puede recuperarse... Para ello habrían dos opciones: La primera sería dirigirnos la ubicación de la papelera y mover el fichero a mano, mientras que la segunda y más eficiente sería recurrir al comando:

restore-trash

Aquí el comando es un poco más complejo que el resto, pues al escribir el comando te mostrará el listado de elementos que están en la papelera (en caso de haberlos) precedidos por un el número de elemento (0,1,2,3,4...). Dicho número empezaría siempre desde 0 y en caso de haber por ejemplo 5 elementos, el último elemento sería el 4. Tras mostrar todos los elementos con su respectivo número, la herramienta nos preguntará qué elemento deseamos restaurar, elemento al que haremos referencia escribiendo su número. Si importante.txt fuese el elemento número 3, habría que introducir dicho número.

La herramienta es indudablemente útil y mantiene la filosofía de papeleras del sistema, pero como bien he dicho antes, corremos el riesgo de escribir el comando rm accidentalmente y causar una "catástrofe"; con lo que una utilidad que dependa tanto del factor humano no es del todo segura.


Método 2: Hacer que rm mueva el contenido a otro sitio mediante el uso de alias

Este método no requiere instalar nada y no permite que el factor humano entre en juego, pues alterará el comportamiento del comando rm. Lo malo de este método es que no mantiene la misma filosofía que la del método 1... Es decir no es tan "limpio" como el anterior método y requiere la creación manual de una papelera de reciclaje para cada usuario... Aún así es innegable que es un método muy seguro que no da lugar a errores.

Para lograrlo usaremos un concepto llamado alias, que puede asociar un comando a una acción determinada. Dicho comando puede ser uno existente, cuya función original sería sobrrescrita, o puede ser uno que inventemos nosotros. La única pega que tienen los alias es que únicamente son válidos en la sesión sobre la que son establecidos; es decir que si por ejemplo se está logeado como root, solo esa sesión de root podría usar ese alias... Aún así ese bache puede ser evitado, tal y como veremos más adelante.

Lo primero que habría que hacer sería crear una carpeta llamada papelera dentro de la carpeta personal de cada usuario para que cada uno disponga de su propia papelera, mediante el comando mkdir. Además también es recomendable modificar los permisos de ésta para que únicamente su dueño pueda modificarlo; lo cual se traduce en que cada usuario tiene que escribir dos líneas en la consola:

  1. mkdir ${HOME}/papelera
  2. chmod 600 ${HOME}/papelera

Con la carpeta creada, lo único que tendríamos que hacer sería crear nuestro nuevo alias; alias al que llamaríamos rm y al que le diríamos que moviese el fichero seleccionado a su correspondiente papelera. Esto puede parecer complicado, pero es tan sencillo como escribir:

alias rm='mv -t $HOME/papelera'

Tal y como he dicho, una alias solo es válido para la sesión actual del usuario con lo que para hacerlo permanente para el usuario habría que añadir el comando que acabamos de escribir al fichero .bashrc, el cual se encuentra dentro de la carpeta home de éste. Obviamente, si deseásemos hacerlo para todos habría que añadir dicha línea para todos...

Para no dejar ningún cabo suelto; ya sea con las papeleras o con la inclusión del alias en el fichero .bashrc de todos los usuarios, he creado un pequeño script que tendrá en cuenta a todo el mundo:

  1. #!/bin/bash
  2. cat /etc/passwd |grep home |cut -d ":" -f 1 > /tmp/listado.txt
  3. mkdir /root/papelera
  4. chmod 700 /root/papelera
  5. echo "alias rm='mv -t "'$HOME'"/papelera'" >> /root/.bashrc
  6. while read USER
  7. do
  8.         mkdir /home/${USER}/papelera
  9.         chown ${USER}:${USER} /home/${USER}/papelera
  10.         chmod 700 /home/${USER}/papelera
  11.         echo "alias rm='mv -t "'$HOME'"/papelera'" >> /home/${USER}/.bashrc
  12. done < /tmp/listado.txt
  13. rm /tmp/listado.txt

Con esto ya podríamos escribir el comando rm sin miedo, si bien es cierto que no estamos usando una papelera "real", sino una creada por nosotros.


Método 3: Combinar los dos primeros métodos

A sabiendas de lo que pueden ofrecernos los dos primeros métodos, podemos combinar las bondades de ambos para evitar borrar por accidente mediante el comando rm, al mismo tiempo de que mantenemos una estructura limpia y organizada. La única "pega" de este último método es que requiere tener trash-cli instalado, pero no supone un gran inconveniente a menos que se carezca de conexión a internet. En mi opinión el método más limpio y efectivo de los tres.

La combinación de ambos métodos consistiría en crear un alias para rm que llame al comando trash-put. Dicho alias quedaría así:

alias rm='trash-put'

Simple y efectivo, pues mantendrá la estructura de papeleras que poseen los entornos de escritorio y evitaremos crear carpetas innecesarias. Obviamente habría que incluir este alias en el fichero .bashrc de todos los usuarios; inclusión que podemos hacer con un pequeño script basado en el anterior:

  1. #!/bin/bash
  2. cat /etc/passwd |grep home |cut -d ":" -f 1 > /tmp/listado.txt
  3. echo "alias rm='alias rm='trash-put'" >> /root/.bashrc
  4. while read USER
  5. do
  6.         echo "alias rm='trash-put'" >> /home/${USER}/.bashrc
  7. done < /tmp/listado.txt
  8. rm /tmp/listado.txt

Gracias a este método tendríamos un método limpio y seguro para borrar nuestros archivos mediante el comando rm.


Todos tienen sus virtudes y defectos, si bien el tercero es el que en mi opinión menos carencias tiene. Aún así, queda siempre a elección de cada uno el método a utilizar para la prevención de borrados accidentales.

Espero que os haya resultado útil.

Saludos.

3 comentarios :

  1. Podrías añadir también los alias y la carpeta papelera a /etc/skel/ y así todo usuario nuevo no tendría que crear nada, ni volver a ejecutar scripts, además de ser transparente para el usuario. Saludos, buen post!

    ResponderEliminar
    Respuestas
    1. Muchas gracias por tus palabras.

      Efectivamente la inclusión del alias se puede hacer en /etc/skel también para tener en cuenta futuros usuarios. El mío era uno de los métodos que podemos usar, si bien el tuyo es por supuesto perfectamente válido, y probablemente más cómodo en caso de andar añadiendo usuarios constantemente.

      Saludos.

      Eliminar
  2. Hola, no funcionaría para los que trabajamos con recursos NFS.

    Saludos

    ResponderEliminar