Pregunta ¿Cómo prevengo la rm -rf / * accidental?


Acabo de correr rm -rf /* accidentalmente, pero quise decir rm -rf ./* (note la estrella después de la barra).

alias rm='rm -i' y --preserve-root por defecto no me salvó, entonces ¿hay alguna protección automática para esto?


No fui root y cancelé el comando inmediatamente, pero hubo algunos permisos relajados en algún lugar o algo así porque noté que mi indicador de Bash ya se había roto. No quiero confiar en los permisos y no ser root (podría cometer el mismo error con sudo), y no quiero buscar errores misteriosos debido a que falta un archivo en algún lugar del sistema, por lo que, las copias de seguridad y sudo son buenos, pero me gustaría algo mejor para este caso específico.


Sobre pensar dos veces y usar el cerebro. ¡Lo estoy usando en realidad! Pero lo estoy usando para resolver una tarea de programación compleja que involucra 10 cosas diferentes. Estoy inmerso en esta tarea lo suficientemente profundo, no me queda ninguna capacidad mental para verificar banderas y caminos, ni siquiera pienso en términos de comandos y argumentos, creo que en términos de acciones como 'dir. Vacío actual', Parte diferente de mi cerebro los traduce en comandos y, a veces, comete errores. Quiero que la computadora los corrija, al menos los peligrosos.


156
2017-12-02 17:09


origen


Para tu información, también puedes hacer rm -rf . /mydir en lugar de rm -rf ./mydir y elimina el directorio en el que estabas. Encuentro que esto sucede más a menudo. - user606723
Para usar una analogía de pistola, esta pregunta dice: por favor, haz que la pistola reconozca que estoy apuntando a mi pie y no disparar, pero no quiero tener ninguna responsabilidad por no apuntar la pistola a mi pie en primer lugar. Las armas y las computadoras son estúpidas y si haces una estupidez, obtendrás estos resultados. Siguiendo la analogía de las armas, nada evitará que te hagas daño, excepto la vigilancia y la práctica. - slillibri
@slillibri Excepto que rm no es un arma, es un programa de computadora, podría ser lo suficientemente inteligente como para determinar que el usuario va a eliminar algunos archivos importantes y emitir una advertencia (como lo hace en realidad si intenta hacerlo) rm -rf / sin estrella). - Valentin Nemcev
Las armas de @slillibri tienen dispositivos de seguridad. Preguntando cómo poner mejor seguridad en el rm El comando es una cuestión de administrador del sistema perfectamente legítima. - Gilles
sudo rm / bin / rm no recomendado, pero evitará la mayoría de las rm :-) - Paul


Respuestas:


Uno de los trucos que sigo es poner # al principio mientras se usa el rm mando.

root@localhost:~# #rm -rf /

Esto evita la ejecución accidental de rm en el archivo / directorio incorrecto. Una vez verificado, eliminar # desde el principio. Este truco funciona, porque en Bash una palabra que comienza con # hace que esa palabra y todos los caracteres restantes en esa línea sean ignorados. Así que el comando es simplemente ignorado.

O

Si quieres evitar algún directorio importante, hay un truco más.

Crea un archivo llamado -i en ese directorio ¿Cómo se puede crear un archivo tan extraño? Utilizando touch -- -i o touch ./-i

Ahora intenta rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

Aquí el * se expandirá -i a la línea de comandos, por lo que su comando se convierte en última instancia rm -rf -i. Por lo tanto, el comando indicará antes de la eliminación. Puedes poner este archivo en tu /, /home/, /etc/, etc.

O

Utilizar --preserve-root como una opción para rm. En el rm incluido en el nuevo coreutils paquetes, esta opción es la predeterminada.

--preserve-root
              do not remove `/' (default)

O

Utilizar caja fuerte

Extracto del sitio web:

Safe-rm es una herramienta de seguridad destinada a evitar la eliminación accidental.   de archivos importantes al reemplazar / bin / rm con una envoltura, que verifica   Los argumentos dados en contra de una lista negra configurable de archivos y   Directorios que nunca deben ser eliminados.

Los usuarios que intentan eliminar uno de estos archivos protegidos o   Los directorios no podrán hacerlo y se mostrará una advertencia.   mensaje en su lugar:

$ rm -rf /usr
Skipping /usr

215
2017-12-02 23:36



Safe-rm se ve muy bien, mirándolo ahora ... - Valentin Nemcev
Safe-rm es limpio. También eso es un truco ingenioso con el -i expediente. Jaja Tonto bash - EricR
Increíble qué tipo de engaño se hace en Unix. - WernerCD
El archivo de creación llamado -i es absolutamente puro genio. Podría haber usado eso hace aproximadamente un año, cuando accidentalmente ejecuté un rm -rf / etc / * en el VPS ... (Afortunadamente, tomo instantáneas nocturnas, así que pude restaurar en menos de 45 minutos). - David W
Es un genio. La brujeria seria touch -- -rf - Mircea Vutcovici


Tu problema:

Simplemente ejecuté rm -rf / * accidentalmente, pero quise decir rm -rf ./* (note la estrella después de la barra).

La solución: ¡No hagas eso! Como cuestión de práctica, no usar ./ Al comienzo de un camino. Las barras inclinadas no agregan ningún valor al comando y solo causarán confusión.

./*significa lo mismo que *, por lo que el comando anterior se escribe mejor como:

rm -rf *

Aquí hay un problema relacionado. Veo la siguiente expresión a menudo, donde alguien asumió que FOO se establece en algo como /home/puppies. Lo vi hoy mismo en realidad, en la documentación de un importante proveedor de software.

rm -rf $FOO/

Pero si FOO no está establecido, esto evaluará a rm -rf /, que intentará eliminar todos los archivos en su sistema. La barra diagonal final no es necesaria, por lo que, en la práctica, no la use.

Lo siguiente hará lo mismo, y es menos probable que dañe su sistema:

rm -rf $FOO

He aprendido estos consejos de la manera más difícil. Cuando tuve mi primera cuenta de superusuario hace 14 años, accidentalmente corrí rm -rf $FOO/ Desde dentro de un script de shell y destruyó un sistema. Los otros 4 administradores de sistemas miraron esto y dijeron: 'Sí. Todo el mundo hace eso una vez. Ahora aquí está su medio de instalación (36 disquetes). Ve a arreglarlo.

Otras personas aquí recomiendan soluciones como --preserve-root y safe-rm. Sin embargo, estas soluciones no están presentes en todas las variantes de Un * xe y es posible que no funcionen en Solaris, FreeBSD y MacOSX. Adicionalmente, safe-rm requiere que instale paquetes adicionales en cada sistema Linux que use. Si confias en safe-rm, que pasa cuando empiezas un nuevo trabajo y no tienen safe-rm instalado? Estas herramientas son una muleta, y es mucho mejor confiar en los valores predeterminados conocidos y mejorar sus hábitos de trabajo.


42
2017-12-02 18:58



Mi amigo me dijo que nunca usa. rm -rf *. Él siempre cambia el directorio primero, y usa un objetivo específico. La razón es que usa mucho la historia de la concha, y le preocupa que tener tal comando en su historia pueda aparecer en el momento equivocado. - haggai_e
@haggai_e: Buen consejo. Cuando era nuevo en Unix, me encontré una vez con un error donde rm -rf * también eliminado . y ... Yo era root, y esto atravesó los directorios inferiores como ../../.., y fue bastante destructivo. Trato de ser muy cuidadoso con rm -rf * desde entonces. - Stefan Lasiewski
rm -rf $FOO no ayudará si necesitas rm -rf $FOO/$BAR. cd $FOO && rm -rf $BAR Ayudará, aunque es mucho más tiempo. - Victor Sergienko
@VictorSergienko, con bash, ¿qué hay de especificar? ${FOO:?}, como en rm -rf ${FOO:?}/ y rm -rf ${FOO:?}/${BAR:?}. Evitará que se traduzca rm -rf /. Tengo más información sobre esto en mi respuesta. aquí. - A-B-B
@haggai_e: Considero que este es uno de los mejores consejos sobre este tema. Me quemé el dedo usando rm -rf *en un bucle for que cambió al directorio incorrecto por error y terminó eliminando otra cosa. Si hubiera utilizado un objetivo específico, habría tenido una oportunidad mucho menor para eliminar algo incorrecto. - richk


Como esto está en "Serverfault", me gustaría decir esto:

Si tiene docenas o más servidores, con un equipo grande de administradores / usuarios, alguien va a rm -rf o chown el directorio equivocado

Debe tener un plan para obtener una copia de seguridad del servicio afectado con el mínimo MTTR posible.


30
2017-12-02 20:42



Y debe usar una VM o una caja de repuesto para practicar recuperaciones: averigüe qué no funcionó y refine dicho plan. Estamos iniciando un reinicio quincenal, porque ha habido cortes de energía en nuestro edificio, y cada vez ha sido doloroso. Al realizar algunas paradas planificadas de todos los racks, lo hemos reducido de unos pocos días de funcionamiento a aproximadamente 3 horas ahora, cada vez que aprendemos qué bits automatizar / corregir scripts init.d para etc. - Danny Staple
Y prueba este comando en una máquina virtual. ¡Es interesante! Pero tome una instantánea primero. - Stefan Lasiewski


Las mejores soluciones consisten en cambiar tus hábitos de no usar. rm directamente.

Un enfoque es correr echo rm -rf /stuff/with/wildcards* primero. Verifique que la salida de los comodines parezca razonable, luego use el historial del shell para ejecutar el comando anterior sin el comando echo.

Otro enfoque es limitar el echo comando a los casos en los que es cegadoramente obvio lo que va a eliminar. En lugar de eliminar todos los archivos de un directorio, elimine el directorio y cree uno nuevo. Un buen método es cambiar el nombre del directorio existente a DELETE-foo, luego crea un nuevo directorio foo Con los permisos apropiados, y finalmente eliminar. DELETE-foo. Un beneficio adicional de este método es que el comando que se ingresó en su historial es rm -rf DELETE-foo.

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

Si realmente insiste en eliminar un montón de archivos porque necesita que el directorio permanezca (porque siempre debe existir, o porque no tendría el permiso para volver a crearlo), mueva los archivos a un directorio diferente y elimine ese directorio. .

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Golpea eso Alt+. llave.)

Eliminar un directorio desde adentro sería atractivo, porque rm -rf . Es corto por lo tanto tiene un bajo riesgo de errores tipográficos. Los sistemas típicos no te dejan hacer eso, desafortunadamente. Puedes a rm -rf -- "$PWD" en cambio, con un mayor riesgo de errores tipográficos, pero la mayoría de ellos llevan a eliminar nada. Tenga en cuenta que esto deja un comando peligroso en su historial de shell.

Siempre que puedas, usa el control de versiones. Tu no rm, tú cvs rm O lo que sea, y eso se puede deshacer.

Zsh tiene opciones para avisarte antes de ejecutar rm con un argumento que lista todos los archivos en un directorio: rm_star_silent (activado de forma predeterminada) avisos antes de ejecutar rm whatever/*y rm_star_wait (desactivado de forma predeterminada) agrega un retraso de 10 segundos durante el cual no puede confirmar. Esto es de uso limitado si pretendía eliminar todos los archivos en algún directorio, porque ya estará esperando el aviso. Puede ayudar a prevenir errores tipográficos como rm foo * para rm foo*.

Hay muchas más soluciones que implican cambiar el rm mando. Una limitación de este enfoque es que un día estará en una máquina con lo real. rm y automáticamente llamarás rm, seguro en su expectativa de confirmación ... y lo siguiente será restaurar las copias de seguridad.


23
2017-12-02 22:33



mv -t DELETE_ME -- * Es un poco más infalible. - Tobu
@Giles no usa rm ¡Directamente es un buen consejo! Una alternativa aún mejor es utilizar el find mando. - aculich
Y si necesita que el directorio permanezca, puede hacerlo simplemente usando find somedir -type f -delete que borrará todos los archivos en somedir pero dejará el directorio y todos los subdirectorios. - aculich


Siempre podrías hacer un alias, como mencionaste:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

También puede integrarlo con un cliente de línea de comandos de twitter para alertar a sus amigos acerca de cómo casi se humilla a sí mismo al limpiar su disco duro con rm -fr /* como raíz


18
2017-12-02 17:16



+1 para telnet miku.acm.uiuc.edu - Ali
alias echo = "telnet miku.acm.uiuc.edu" - kubanczyk
No debo ser lo suficientemente vieja ... ¿cuál es el significado de telnet miku.acm.uiuc.edu? - Kyle Strand
Pruébalo y descúbrelo. No es destructivo. Si eres tan paranoico como deberías, ejecuta en una máquina virtual. - Naftuli Kay
-1 No puede alias comandos con espacios en ellos y mucho menos / *, que es un nombre no válido - xenithorb


Sí: no trabajes como root y siempre piensa dos veces antes de actuar.

Además, echa un vistazo a algo como https://launchpad.net/safe-rm.


15
2018-02-26 05:50



Mencionó trabajar como root en la edición. - Valentin Nemcev
@Valentin: o_O !! - Jonathan Rioux


La forma más sencilla de prevenir accidentes. rm -rf /* es evitar todo uso de la rm ¡mando! De hecho, siempre he tenido la tentación de correr rm /bin/rm para deshacerse de la orden por completo! No, no estoy siendo gracioso.

En su lugar, utilice el -delete opción de la find mando, pero primero, antes de eliminar los archivos, recomiendo obtener una vista previa de los archivos que se eliminarán:

find | less

Tenga en cuenta, en las versiones modernas de find Si omite el nombre de un directorio, utilizará implícitamente el directorio actual, por lo que lo anterior es el equivalente de:

find . | less

Una vez que esté seguro de que estos son los archivos que desea eliminar, puede agregar el -delete opción:

find path/to/files -delete

Entonces, no solo es find  Más seguro de usar, también es más expresivo.Entonces, si desea eliminar solo ciertos archivos en una jerarquía de directorios que coinciden con un patrón en particular, puede usar una expresión como esta para obtener una vista previa y luego eliminar los archivos:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

Hay muchas buenas razones para aprender y usar. find además de solo un seguro rm, así que más tarde te agradecerás si te tomas el tiempo para aprender a usar find.


15
2017-12-03 22:44



Discusión muy interesante. Me gusta tu enfoque e hice un pequeño fragmento. Es súper ineficiente, ya que llama a encontrar como máximo 3 veces, pero para mí este es un buen comienzo: github.com/der-Daniel/fdel - Daniel Hitzel


Hay un consejo realmente malo en este hilo, afortunadamente la mayoría ha sido rechazada.

En primer lugar, cuando necesite ser root, conviértase en root - sudo y los diversos trucos de alias lo debilitarán. Y peor aún, te harán descuidado. Aprenda a hacer las cosas de la manera correcta, deje de depender de los alias para protegerse. Un día obtendrás root en una caja que no tiene tus ruedas de entrenamiento y hacer explotar algo.

En segundo lugar, cuando tenga raíz, piense en sí mismo como si manejara un autobús lleno de niños de la escuela. A veces, puedes escuchar la canción en la radio, pero otras veces debes mirar en ambas direcciones, reducir la velocidad y revisar dos veces todos los espejos.

Tercero - Casi nunca De Verdad Tiene que rm -rf - más probable es que quieras mv something something.bak o mkdir _trash && mv something _trash/

Cuarto - siempre ls tu comodín antes rm - No hay nada loco por mirar algo antes de destruirlo para siempre.


14
2017-12-02 19:57



+1 para uso de ls. - Sachin Divekar
@eventi Estoy de acuerdo en que hay algunos consejos terribles y trucos feos en este hilo. Y definitivamente es una buena idea mirar algo antes de destruirlo, pero hay una incluso mejor manera de hacerlo usando el find mando. - aculich
No veo cómo encontrar es más simple o más seguro, pero me gusta tu find . -name '*~' ejemplo. Mi punto es que ls listará el mismo globo que rm utilizará. - eventi


Este es mi estándar específicamente para las expresiones regulares en el contexto de rm, pero te habría salvado en este caso.

Siempre hago echo foo*/[0-9]*{bar,baz}* En primer lugar, para ver lo que va a coincidir con la expresión regular. Una vez que tengo la salida, vuelvo con la edición de la línea de comandos y cambio echo a rm -rf. yo nunca, nunca use rm -rf en una expresión regular no probada.


11
2017-12-02 19:05



Por favor compare: linuxmanpages.com/man3/regex.3.php  linuxmanpages.com/man3/glob.3.php - bukzor
Ok que busco ¿Está señalando que la sintaxis de expresiones regulares para la coincidencia de archivos es diferente (ya veces se llama con un nombre diferente) de la que se usa en, por ejemplo, Perl? ¿O algún otro punto que me haya perdido? Pido disculpas por mi lentitud de pensamiento, ¡es lo primero que hace el sábado por la mañana aquí! - MadHatter
Estas cosas que usted llama "regexp" son de hecho globs. No es una sintaxis de expresiones regulares diferente; no es un regex - bukzor
Ese argumento ciertamente podría ser hecho; sin embargo, en el artículo de wikipedia sobre expresiones regulares, encuentro que "Muchos sistemas de computación modernos proporcionan caracteres comodín en nombres de archivos coincidentes de un sistema de archivos. Esta es una capacidad central de muchos shells de línea de comandos y también se conoce como" globbing " el uso de "también conocido como", que me parece que indica que los tokens de llamada que contienen metacaracteres para coincidir con uno o más nombres de archivos regexps no es incorrecto. Estoy de acuerdo en que globbing es un término mejor porque no significa nada más que el uso de expresiones regulares en la concordancia de nombres de archivos. - MadHatter
@MadHatter Verificación para ver qué archivos coinciden antes de eliminarlos es un buen consejo, pero hay un Manera más segura y expresiva de hacerlo con el find mando. - aculich