Отключить 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 предполагает, что вы знаете, что делаете, и хотите делать то, что говорите.