Las mejores prácticas para crear un alias del comando rm y hacerlo más seguro

21

Hace algún tiempo borré erróneamente mi carpeta de inicio porque ejecuté una rm -rf *en la terminal incorrecta, ¡cuyo directorio de trabajo era la carpeta de inicio!

Desearía tener un alias para el rmcomando, pero no fue el caso.

Ahora, estoy planeando hacer un script como un alias para rm.

¿Tiene alguna mejor práctica que sugerir?

Gracias.

Vincenzo Pii
fuente
77
No es que no tenga simpatía, pero no creo que rmsea ​​un comando peligroso que requiera un alias por seguridad. Al usar las opciones ry f, le está diciendo al shell que sé que esto es peligroso, y lo he pensado cuidadosamente, y es realmente lo que quiero hacer . Si no usa esas opciones, no puede eliminar toda su carpeta de inicio con ella.
user26512
¿Esta pregunta cubre la misma información que stackoverflow.com/questions/373156/… ?
David Harris el
1
@grossvogel sin ofender :) Sin embargo, aliasing este comando es una práctica común. Mucha gente usa la opción -f para evitar confirmar cada eliminación.
23
Tenga en cuenta que si usa un alias rm, se acostumbrará a ese alias. Entonces, un día, estarás en un sistema donde el alias no existe, y harás lo incorrecto cuando menos lo esperes. Y probablemente no será tu sistema.
Stefan Lasiewski
2
@puller Sólo en sistemas como RHEL ese alias estúpidamente rma rm -i.
Daniel Beck

Respuestas:

30

Si desea un personalizado rm, no lo llame rmsino un nombre suyo myrm, deleteo lo que sea.

El rm='rm -i'alias es un horror porque después de un tiempo utilizándolo, esperará rmque le pregunte por defecto antes de eliminar archivos. Por supuesto, un día lo ejecutará con una cuenta que no tiene ese alias establecido y antes de que entienda lo que está sucediendo, es demasiado tarde.

En cualquier caso, una buena manera de estar preparado para la pérdida o corrupción de archivos es hacer copias de seguridad.

Una alternativa rápida que lo protegerá contra la eliminación o sobrescritura accidental de archivos es utilizar un sistema de archivos que admita instantáneas ilimitadas como ZFS. Si las instantáneas frecuentes se realizan automáticamente, puede recuperar los archivos en el estado en que se encontraban durante la última instantánea antes del incidente.  

jlliagre
fuente
3
He escuchado personalmente esa historia de horror de uno de los que la sufrió.
Dan D.
Estoy de acuerdo, pero la mayoría de las personas no tienen la libertad de cambiar a un sistema de archivos completamente diferente.
Peon
De hecho, esa es la razón por la que primero sugiero hacer copias de seguridad, una característica que ningún sistema de archivos prohíbe.
jlliagre
12

Si desea guardar alias, pero no quiere arriesgarse a acostumbrarse a los comandos que funcionan de manera diferente en su sistema que en otros, puede deshabilitar de rmesta manera

alias rm='echo "rm is disabled, use remove or trash or /bin/rm instead."'

Luego puede crear su propio alias seguro, p. Ej.

alias remove='/bin/rm -irv'

o usar trashen su lugar.

Dario Seidl
fuente
2
Tenga en cuenta que (al menos en algunas versiones) debe definir los alias en el otro orden. Hacerlo en el orden que presenta se define removecomo echo "rm is disabled, use trash or /bin/rm instead." -irv. Y, como cuestión de sentido común, ¿no le gustaría que el mensaje se rmrefiera a su removecomando de seguridad ?
Scott,
Tienes razón, actualizaré la respuesta en consecuencia.
Dario Seidl
5

Podrías intentar usar en su trashlugar. Solo recuerda vaciarlo de vez en cuando ...

l0b0
fuente
3

Sin tener que cambiar el perfil de todos, lo que puede hacer es colocar el archivo llamado -i en el directorio.

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 
Corazón oscuro
fuente
No funcionará si el usuario decide usar *. * en lugar de solo *. Pero sigue siendo un buen truco.
Peon
1
afaik rm -rf. ni rm -rf .. no puede tener éxito porque actualmente está en el directorio.
Peon
@Peon: Creo que quieres decir .* *, en lugar de * .*(lo que creo que es más común) o * . *(lo que dijiste). ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... para que esta técnica sea verdaderamente efectiva a nivel mundial, debe hacerlo en cada directorio donde tenga permiso de escritura . Pero estoy de acuerdo, es un buen truco.
Scott,
1

Yo uso el siguiente script.

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

Si accidentalmente borra un archivo, recupérelo del $HOME/tmp.

El script mueve los archivos eliminados a un tmpdirectorio y los elimina la próxima vez que se ejecute si el tiempo de acceso es 7 días después (limpieza semiautomática del $HOME/tmpdirectorio).

usuario580224
fuente
-2

En tu perfil,

alias rm="rm -i"

fuente
3
Aliasing rm es, en mi opinión, un consejo bastante pobre y de todos modos no ayudará en el caso de tirador.
jlliagre
rm -Ida lo mejor de ambos mundos, @jlliagre.
Tamara Wijsman
@Tom Wijsman, parcialmente de hecho. Cambiar el comportamiento de un comando estándar crítico de Unix sigue siendo un riesgo potencial aquí. Si desea que sea interactivo, asigne un nombre diferente al alias.
jlliagre
@jlliagre: Hmm, ¿quieres decir que los scripts captan este cambio?
Tamara Wijsman
Lea mi respuesta superuser.com/a/382498/19279 para obtener mi punto.
jlliagre
-2

Un guión llamado d, con contenido mv $* /tmp.

editar: esta es una mala idea; vea abajo. Actualmente tengo alias d='mv -t /tmp'en mi .profilelugar.

beefus
fuente
2
Esta sugerencia es peligrosa y podría a) anular los archivos que ya están en la papelera con el mismo nombre ob) eliminar los archivos completamente incorrectos ( d "foo bar"eliminará los archivos fooy bar). Probablemente sea más seguro #!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempy la mvsintaxis depende de su sistema, este funciona para Linux).
Daniel Beck
2
Gracias por la explicación. Estoy bien con el problema a) pero el problema b) es un gran problema. Cambié mi dcomando a alias d='mv -t /tmp'en mi .profile; Creo que esa es la solución simple que estaba buscando.
beefus
-2

Este código bash agrega la función rma su ~/.bash_profilearchivo de configuración. Después de ejecutar esto, si escribe rm file, moverá ese archivo a/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF
Vicente Gonzalez
fuente
1
¿Qué hace este script / código? Explique para que los usuarios menos técnicos puedan entender su respuesta.
Vylix
2
Si bien esto puede responder la pregunta, sería una mejor respuesta si pudiera proporcionar alguna explicación de por qué lo hace.
DavidPostill
1
Esto proporciona una respuesta a la pregunta, pero es muy pobre. Ya se han publicado dos versiones mejores de esta respuesta.
Scott,
Este código bash agrega la función rma su ~/.bash_profilearchivo de configuración. Después de ejecutar este archivo, si escribe rm file, moverá ese archivo a /tmp.
Vicente Gonzalez
Gracias por la explicación. ¿Podrías editar tu respuesta para incluirla en la publicación misma?
Ben N