¿Cómo evitar un rm -rf equivocado para carpetas específicas?


8

Creo que mucha gente aquí erróneamente ' rm -rf' editó el directorio equivocado, y con suerte no causó un gran daño ... ¿Hay alguna forma de evitar que los usuarios hagan una historia de terror similar a Unix ? Alguien mencionó (en la sección de comentarios del enlace anterior ) que

... Estoy bastante seguro de que ahora cada curso o compañía de Unix que usa unix establece rm -fr para deshabilitar las cuentas de las personas que intentan ejecutarlo o evitar que lo ejecuten ...

¿Hay alguna implementación de eso en alguna distribución actual de Unix o Linux? ¿Y cuál es la práctica común para evitar ese error incluso desde un administrador de sistemas (con acceso de root)?

Parece que hubo cierta protección para el directorio raíz ( /) en Solaris (desde 2005) y GNU (desde 2006). ¿Hay alguna forma de implementar la misma forma de protección en otras carpetas también?

Para darle más claridad, no estaba preguntando sobre consejos generales sobre el rmuso (y he actualizado el título para indicar que más), quiero algo más como la protección de la carpeta raíz: para rm -rf /que tenga que pasar un parámetro específico: rm -rf --no-preserve-root /¿Hay implementaciones similares para un conjunto personalizado de directorios? ¿O puedo especificar archivos además /de estar protegidos por la opción preservar raíz ?


11
1) Gestión de cambios 2) Copias de seguridad.
mattdm

66
probablemente la única forma sería reemplazar el rmcomando con uno que no tenga esa característica.
Keith el

2
safe-rm maybe
sr_

2
la mayoría de las distribuciones hacen `alias rm = 'rm -i', lo que hace que rm te pregunte si estás seguro. además de eso: sepa lo que está haciendo. solo se convierte en root si es necesario. para cualquier usuario con privilegios de root, el usuario debe implementar seguridad de cualquier tipo. contrata a alguien si no puedes hacerlo tú mismo. con el tiempo, cualquier contramedida se convierte en equivalente a la línea de alias de arriba si no puedes entender el problema.
Bananguin

1
@amyassin usando rm -rfpuede ser un evento generador de currículum. Check y triple check antes de ejecutarlo
midnightsteel

Respuestas:


15

Para evitar un error rm -rf, no escribarm -rf .

Si necesita eliminar un árbol de directorios, le recomiendo el siguiente flujo de trabajo:

  • Si es necesario, cambie al padre del directorio que desea eliminar.
  • mv directory-to-delete DELETE
  • Explore DELETEy compruebe que realmente es lo que desea eliminar
  • rm -rf DELETE

Nunca llame rm -rfcon una discusión que no sea DELETE. Hacer la eliminación en varias etapas le da la oportunidad de verificar que no está eliminando lo incorrecto, ya sea debido a un error tipográfico (como en rm -rf /foo /barlugar de rm -rf /foo/bar) o debido a un cerebro (vaya, no, quise eliminar foo.oldy mantener foo.new) .

Si su problema es que no puede confiar en que otros no escriban rm -rf, considere eliminar sus privilegios de administrador. Hay mucho más que puede salir mal que rm.


Siempre haga copias de seguridad .

Verifique periódicamente que sus copias de seguridad estén funcionando y actualizadas.

Mantenga todo lo que no se pueda descargar fácilmente desde algún lugar bajo control de versiones.


Con un sistema básico de Unix, si realmente desea hacer que algunos directorios sean indelectables rm, reemplace (o mejor sombra) rmpor un script personalizado que rechace ciertos argumentos. O hg rm.

Algunas variantes de Unix ofrecen más posibilidades.

  • En OSX, puede establecer una lista de control de acceso en un directorio evitando la eliminación de los archivos y subdirectorios dentro de él, sin impedir la creación de nuevas entradas o la modificación de entradas existentes: chmod +a 'group:everyone deny delete_child' somedir(esto no impide la eliminación de archivos en subdirectorios: si si quieres eso, configura la ACL en el subdirectorio también).
  • En Linux, puede establecer reglas en SELinux, AppArmor u otros marcos de seguridad que prohíban rmmodificar ciertos directorios.

Sí retrocesos es la solución más increíble, pero yo estaba pensando en algo así como la --no-preserve-rootopción, por otra carpeta importante .. Y que al parecer no existe siquiera como una práctica ...
amyassin

He editado la pregunta para indicar qué quiero más ...
amyassin

1
@amyassin Me temo que no hay nada más (al menos no en Linux). rm -rfya significa "eliminar esto, sí, estoy seguro de saber lo que estoy haciendo". Si desea más, reemplácelo rmpor un script que se niega a eliminar ciertos directorios.
Gilles 'SO- deja de ser malvado'

Por favor, edite el último comentario a la pregunta ya que creo que es responder a la pregunta así ...
amyassin

2
@amyassin En realidad, retiro esto. No hay nada más en un Linux tradicional, pero puede establecer reglas de Apparmor / SELinux / ... que impidan el rmacceso a ciertos directorios. Además, dado que su pregunta no es solo sobre Linux, debería haber mencionado OSX, que tiene algo parecido a lo que desea.
Gilles 'SO- deja de ser malo'

4

Si está utilizando rm *y el zsh, puede configurar la opción rmstarwait:

setopt rmstarwait

Ahora el shell advierte cuando estás usando *:

> zsh -f
> setopt rmstarwait
> touch a b c
> rm *
zsh: sure you want to delete all the files in /home/unixuser [yn]? _

Cuando lo rechazas ( n), no pasa nada. De lo contrario, todos los archivos serán eliminados.


¿Para qué zsh -fsirve?
James

3

Para protegerse contra un accidente rm -rf *en un directorio, cree un archivo llamado "-i" (puede hacerlo con emacs o algún otro programa) en ese directorio. El shell intentará interpretar -i y hará que entre en modo interactivo.

Por ejemplo: tiene un directorio llamado rmtestcon el archivo nombrado -identro. Si intenta hacer rmtodo lo que está dentro del directorio, rmprimero se -ilo pasará y pasará al modo interactivo. Si coloca dicho archivo dentro de los directorios en los que le gustaría tener alguna protección, podría ayudar.

Tenga en cuenta que esto no es efectivo contra rm -rf rmtest.


He editado la pregunta para indicar qué quiero más ...
amyassin

Truco impresionante! El archivo se crea fácilmente con> -i
capitano666

2

EDITAR como lo sugiere el comentario:

Puede cambiar el atributo de a inmutable el archivo o directorio y luego no se puede eliminar ni siquiera por root hasta que se elimine el atributo.

chattr +i /some/important/file

Esto también significa que el archivo no se puede escribir ni modificar de ninguna manera, ni siquiera por root . Otro atributo aparentemente disponible que no he utilizado yo mismo es el atributo append ( chattr +a /some/important/file. Entonces el archivo solo se puede abrir en modo append, lo que significa que no se puede eliminar también, pero puede agregarlo (digamos un archivo de registro). Esto significa que usted no podrá editarlo, vimpor ejemplo, pero puede hacerlo echo 'this adds a line' >> /some/important/file. Usar en >lugar de >>fallará.

Estos atributos se pueden desarmar usando un signo menos, es decir chattr -i file

De lo contrario, si esto no es adecuado, una cosa que practico es siempre ls /some/dirprimero, y luego, en lugar de volver a escribir el comando, presione la flecha hacia arriba CTL-A, luego elimine lsy escriba mi rm -rfsi lo necesito. No es perfecto, pero al mirar los resultados de ls, sabes de antemano si es lo que querías.


He editado la pregunta para indicar qué quiero más ...
amyassin

2

Si entiende el lenguaje de programación C, creo que es posible reescribir el código fuente rm y hacer un pequeño parche para el núcleo. Vi esto en un servidor y fue imposible eliminar algunos directores importantes y cuando escribes 'rm -rf / direcotyr' envía un correo electrónico a sysadmin.


1

Una opción posible es dejar de usar rm -rfy comenzar a usar rm -ri. El iparámetro adicional es asegurarse de que le pregunte si está seguro de que desea eliminar el archivo.

Probablemente su mejor apuesta con esto sería alias rm -rien algo memorable como kill_it_with_fire. De esta manera, cuando tengas ganas de quitar algo, adelante y mátalo con fuego.


1
Me gusta el nombre, pero ¿no fes exactamente lo contrario de la iopción? Lo intenté y trabajé sin embargo ...
amyassin

@amyassin Sí, lo es. Por algún tipo extraño de moda, pensé que solo tenía rallí. Solo lo arreglé.
NlightNFotis

He editado la pregunta para indicar qué quiero más ...
amyassin

-1

Me gusta poner el nombre del directorio primero así:

$ rm /directoryname -rf

55
esto viola las pautas POSIX.
gelraen

He editado la pregunta para indicar qué quiero más ...
amyassin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.