Come posso impedire a bash di eseguire 'rm' quando '*' è uno degli argomenti?


1

Desidero assicurarmi dall'uso accidentale

rm [argument_i] * [argument_j]

cioè dovrebbe sempre rifiutare di eseguire il comando, quando il carattere asterisco è separato da uno spazio bianco su entrambi i lati, qualunque cosa sia prima o dopo l'asterisco.

Quale comando devo aggiungere al mio .bashrcper abilitare tale controllo?

Grazie per eventuali suggerimenti.


Relativo a ServerFault

Risposte:


1

Penso che dovresti definire un alias da rm, quindi ogni volta che esegui rm, non sarà rm stesso ma il tuo alias.

In questo alias puoi analizzare tutto.

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

E questo script può avere tutti i parametri di analisi che desideri.

Questo alias dovrebbe essere messo in .bashrc / .bash_profile, o anche in / etc / profile se vuoi che sia applicato a tutti gli utenti.

Modifica In seguito ai commenti, ho aggiunto un wrapper che disabilita * interpretato come un elenco di tutti i file e diventa solo una stringa.

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

Lo script potrebbe iniziare in questo modo:

#!/bin/sh

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

Test:

$ rm a * b
asterisk!

5
Non credo che fare affidamento su un alias rmsia una buona idea. Verrai catturato senza l'alias qualche volta, ma continuerai a fare affidamento sulla sua protezione e si scatenerà l'inferno. È meglio imparare a pensare " rmè pericoloso; fammi controllare la mia linea di comando" piuttosto che fare affidamento su una stampella.
Jonathan Leffler,

Sono d'accordo, rm è piuttosto pericoloso e tutti noi abbiamo delle brutte esperienze con esso :) Comunque, avere un alias è la soluzione migliore che trovo per questo caso. Altrimenti, puoi anche compilarne un altro rmma può essere un lavoro duro.

5
Non penso che ciò sarebbe d'aiuto, come *viene espanso dalla shell prima di essere inviato come parametro al tuo script o binario. Quindi non troverai un *nella lista degli argomenti del tuo script, ma piuttosto un elenco di tutti i file nella directory corrente.

Ma potresti scrivere uno script wrapper che controlla se tutti i file della directory corrente vengono passati negli argomenti e avvisa / interrompe, se sono presenti
BeniBela,

Buono a leggere tutte le idee. Ho preso @BeniBela idea, ma ho un paio di suggerimenti da stackoverflow.com/questions/1193658/... e stackoverflow.com/questions/3701809/... . Ora dovrebbe funzionare con il codice nella mia risposta.

1

Come ho suggerito in una domanda diversa, usare una trap DEBUG che controlla BASH_COMMAND farà il trucco:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.