GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo evito rm -rf /* accidental?

Solución 1:

Uno de los trucos que sigo es poner # al principio mientras usaba el rm comando.

[email protected]:~# #rm -rf /

Esto evita la ejecución accidental de rm en el archivo/directorio incorrecto. Una vez verificado, elimine # 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. Entonces el comando simplemente se ignora.

O

Si desea evitar cualquier 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? Usando touch -- -i o touch ./-i

Ahora prueba rm -rf * :

[email protected]:~$ touch {1..4}
[email protected]:~$ touch -- -i
[email protected]:~$ ls
1  2  3  4  -i
[email protected]:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

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

O

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

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

O

Usar seguro-rm

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 un contenedor, que verifica los argumentos dados contra una lista negra configurable de archivos y directorios que nunca deben eliminarse.

Los usuarios que intenten eliminar uno de estos archivos o directorios protegidos no podrán hacerlo y, en su lugar, se les mostrará un mensaje de advertencia:

$ rm -rf /usr
Skipping /usr

Solución 2:

Tu problema:

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

La solución:¡No hagas eso! Como cuestión de práctica, no use ./ al principio de un camino. Las barras no agregan 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 está configurado en algo como /home/puppies . De hecho, vi esto hoy mismo, en la documentación de un importante proveedor de software.

rm -rf $FOO/

Pero si FOO no está configurado, esto se evaluará como rm -rf / , que intentará eliminar todos los archivos de su sistema. La barra inclinada final no es necesaria, por lo que, como cuestión de práctica, no la use.

Lo siguiente hará lo mismo y es menos probable que corrompa su sistema:

rm -rf $FOO

He aprendido estos consejos de la manera difícil. Cuando tuve mi primera cuenta de superusuario hace 14 años, accidentalmente ejecuté 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 para todas las variantes de Un*xe y es posible que no funcionen en Solaris, FreeBSD y MacOSX. Además, safe-rm requiere que instale paquetes adicionales en cada sistema Linux que utilice. Si confía en safe-rm , qué sucede cuando comienzas 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.

Solución 3:

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 recuperar el servicio afectado con el menor MTTR posible.

Solución 4:

Las mejores soluciones implican cambiar tus hábitos para no usar rm directamente.

Un enfoque es ejecutar 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 echo .

Otro enfoque es limitar el echo Comando a los casos en los que es absolutamente obvio lo que 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 elimine DELETE-foo . Un beneficio adicional de este método es que el comando que se ingresa 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 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

(Presiona ese Alt +. clave.)

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

Siempre que puedas, utiliza el control de versiones. No rm , tú cvs rm o lo que sea, y eso se puede deshacer.

Zsh tiene opciones para avisarle antes de ejecutar rm con un argumento que lista todos los archivos en un directorio:rm_star_silent (activado de forma predeterminada) antes de ejecutar rm whatever/* y rm_star_wait (desactivado de manera predeterminada) agrega un retraso de 10 segundos durante el cual no puede confirmar. Esto tiene un uso limitado si tenía la intención de 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 dominio. Una limitación de este enfoque es que un día estarás en una máquina con el rm real y automáticamente llamarás al rm , con la seguridad de esperar una confirmación... y lo próximo que hará será restaurar las copias de seguridad.

Solución 5:

Siempre puedes 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 Twitter de línea de comandos para alertar a sus amigos sobre cómo casi se humilla al borrar su disco duro con rm -fr /* como raíz.


Linux
  1. Cómo las VPN previenen los ataques DDOS

  2. [Linux]:Cómo evitar la ejecución accidental del comando “rm -rf”

  3. Linux:¿cómo medir y prevenir la desviación del reloj?

  4. Journalctl:¿Cómo evitar que el texto se trunque en la terminal?

  5. ¿Cómo evitar que `ls` ordene la salida?

Cómo evitar el apagado o reinicio accidental en Linux

Cómo evitar que se agote el tiempo de espera de SSH

Cómo prevenir un ataque cibernético

¿Cómo evitar que un programa específico se intercambie?

¿Cómo puedo evitar o interrumpir copiar/pegar accidentalmente en la terminal?

¿Cómo puedo evitar que se detecten los calamares?