Отключить rm * на производственных серверах

Есть ли способ заблокировать rm с одним * в производственных серверах? Это поможет предотвратить несчастные случаи, такие как:

rm test *

вместо

rm test*

5 ответов

Решение

Используйте zsh --- он автоматически спросит вас, хотите ли вы удалить все файлы в каталоге.

server:~/dir/processing> rm *                                                                                                                    
zsh: sure you want to delete all the files in /home/wheel/dja/dir/processing [yn]?

(Я предполагаю, что это функция по умолчанию - я не могу найти какие-либо параметры конфигурации, которые были настроены для его включения, но я не написал свой.zshrc)

Вот функция bash, которая может быть получена из.bashrc для добавления предупреждения, когда вы используете rm с более чем 2 аргументами:

unalias rm 2>/dev/null
real_rm=/bin/rm
rm_opts=""

function confirm {
  echo -n "Do you want to continue (Y/N)? "
  read v
  v=$(echo $v|tr '[a-z]' '[A-Z]')
  if [[ "$v" == "Y" ]]; then
    return 0
  elif [[ "$v" == "N" ]]; then
    return 1
  else
    confirm
  fi
}

function rm {

  if [ $# -gt 2 ]; then
    echo "WARNING: You have passed a list of files and directories that is $# entries long!  Is this what you intended?"
    echo "Here is the list of files:"
    echo "$@"
    confirm
    if [ $? -eq 0 ]; then
      $real_rm $rm_opts $@
    fi
  else
    $real_rm $rm_opts $@
  fi

}

Не без замены оболочки. rm даже не видит * поскольку оболочка перебирает соответствующие имена файлов перед передачей их rm,

Не решение, но маленький обходной путь. кличка rm как rm -i,

Этот обходной путь не помогает, когда используется флаг -f.

Вы также можете указать специальный псевдоним, который пользователь, которого вы интересует, может использовать вместо этой ошибки. например

alias rm-test="rm test*"

Опять же, это больше обходной путь, но, как правило, *nix предполагает, что вы знаете, что делаете, и хотите делать то, что говорите.

Другие вопросы по тегам