¿Cómo puedo evitar que bash ejecute 'rm' cuando '*' es uno de los argumentos?

1

Deseo asegurarme de usar accidentalmente

rm [argument_i] * [argument_j]

es decir, siempre debe negarse a ejecutar el comando, cuando el carácter de asterisco está separado por espacios en blanco en ambos lados, sin importar qué más haya antes o después del asterisco.

¿Qué comando debo agregar a mi .bashrcpara habilitar tal verificación?

Gracias por cualquier pista.

TMOTTM
fuente
Relacionado con ServerFault

Respuestas:

1

Creo que es mejor que defina un alias para rm, por lo que cada vez que ejecute rm, no será rm en sí mismo sino su alias.

En este alias puedes analizar todo.

alias rm='/my/path/myrm.sh'

Y este script puede tener todos los parámetros de análisis que desee.

Este alias debe colocarse en .bashrc / .bash_profile, o incluso en / etc / profile si desea que se aplique a todos los usuarios.

Editar Siguiendo los comentarios a continuación, agregué un contenedor que deshabilita * interpretado como una lista de todos los archivos y se convierte en una cadena.

alias rm='set -f; /bin/sh /home/me/test/rm.sh'

El script podría comenzar así:

#!/bin/sh

if echo "$2" | grep '*' > /dev/null; then
    echo "asterisk!"
else
    echo "hi this is $var1 and $var2 and $var3"
fi 

Prueba:

$ rm a * b
asterisk!
fedorqui
fuente
55
No creo que confiar en un alias rmsea ​​una buena idea. Alguna vez te atraparán sin el alias, pero seguirás confiando en su protección, y todo el infierno se desatará. Es mejor aprender a pensar " rmes peligroso; déjame revisar mi línea de comando" que confiar en una muleta.
Jonathan Leffler
Estoy de acuerdo con eso, rm es bastante peligroso y todos tenemos malas experiencias con él :) De todos modos, tener un alias es la mejor solución que encuentro para este caso. De lo contrario, también puede compilar otro rmpero puede ser un trabajo duro.
55
No creo que esto ayude, ya que *el shell lo expande antes de enviarlo como parámetro a su script o binario. Por lo tanto, no encontrará un *en la lista de argumentos de su script, sino más bien una lista de todos los archivos en el directorio actual.
Sin embargo, se podría escribir un guión envoltorio que comprueba si se pasan todos los archivos del directorio actual en los argumentos y advierte / aborta, si están allí
BeniBela
Es bueno leer todas las ideas. Tomé la idea de @BeniBela y obtuve algunos consejos de stackoverflow.com/questions/1193658/… y stackoverflow.com/questions/3701809/… . Ahora debería funcionar con código en mi respuesta.
1

Como sugerí en una pregunta diferente, usar una trampa DEBUG que verifique BASH_COMMAND hará el truco:

check_for_wildcard_rm() {
  local rm_glob_re='^rm[[:space:]](.*[[:space:]])?[*]([[:space:]]|$)'
  if [[ $BASH_COMMAND =~ $rm_glob_re ]]; then
    echo "Suppressing rm with a bare *" >&2
    return 1
  fi
  return 0
}
shopt -s extdebug
trap check_for_wildcard_rm DEBUG
Charles Duffy
fuente