Назад | Перейти на главную страницу

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

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

rm test *

вместо того

rm test*

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

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.

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

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

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

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

alias rm-test="rm test*"

Опять же, это скорее работа, но в целом * nix предполагает, что вы знаете, что делаете, и собираетесь делать то, что говорите.