- Поддерживаемые версии
- Отсутствует
Простенький скрипт для ~/.bashrc который запрашивает подтверждение команд или команд с опасными аргументами, перед её выполнением.
Он срабатывает только когда вы вводите команду в терминале, он не мешает скриптам и пайпам (echo y | rm).
Для справки – скрипт не требует подтверждение (допустим команды rm *) для каждого удаляемого файла, при вводе rm * выведется:
И при подтверждении удаляется все перечисленные файлы.
1. Кидаете код в конец ~/.bashrc
2. Пишете source ~/.bashrc
3. Профит.
Вот сам скрипт:
Код:
if [[ $- == *i* ]]; then
_command_guard() {
local cmd="$1"
shift
if [[ ! -t 0 ]]; then
command -- "$cmd" "$@"
return $?
fi
local args_str
args_str=$(printf "%q " "$@")
printf "\033[1;31m[ЗАЩИТА]\033[0m Вы точно хотите выполнить: %s%s? [y/N]: " "$cmd" "${args_str:+ ${args_str% }}"
local reply
read -r reply < /dev/tty
if [[ "$reply" == [YyНн] || "$reply" == yes || "$reply" == да ]]; then
command -- "$cmd" "$@"
return $?
else
printf "\033[1;32mДействие отменено.\033[0m\n"
return 1
fi
}
_has_danger_args() {
local danger_patterns=($1)
shift
local arg pattern
for arg in "$@"; do
[[ "$arg" == "--" ]] && return 1
if [[ "$arg" == --* ]]; then
for pattern in "${danger_patterns[@]}"; do
[[ "$arg" == "$pattern" ]] && return 0
done
elif [[ "$arg" == -* ]]; then
for pattern in "${danger_patterns[@]}"; do
[[ "$pattern" != --* && "$arg" == *"$pattern"* ]] && return 0
done
fi
done
return 1
}
rm() {
if _has_danger_args "r R --recursive" "$@"; then
_command_guard rm "$@"
else
command -- rm "$@"
fi
}
chmod() {
if _has_danger_args "R --recursive" "$@"; then
_command_guard chmod "$@"
else
command -- chmod "$@"
fi
}
chown() {
if _has_danger_args "R --recursive" "$@"; then
_command_guard chown "$@"
else
command -- chown "$@"
fi
}
deluser() { _command_guard deluser "$@"; }
userdel() { _command_guard userdel "$@"; }
delgroup() { _command_guard delgroup "$@"; }
groupdel() { _command_guard groupdel "$@"; }
dd() { _command_guard dd "$@"; }
shred() { _command_guard shred "$@"; }
usermod() { _command_guard usermod "$@"; }
sfdisk() { _command_guard sfdisk "$@"; }
fdisk() { _command_guard fdisk "$@"; }
parted() { _command_guard parted "$@"; }
mkfs() { _command_guard mkfs "$@"; }
fi
Вообще, вы можете подставлять одобрение к каким угодно вам командам. Просто подставляете строчку
Код:
rm() { _command_guard rm "$@"; }
и заменяете rm на нужную вам команду.
Чтобы добавить новые опасные аргументы, введите:
Код:
rm() {
if _has_danger_args "r R --recursive" "$@"; then
_command_guard rm "$@"
else
command -- rm "$@"
fi
}
Замените rm на нужную вам команду и перечислите в _has_danger_args все опасные аргументы вашей команды, через пробел. Теперь только при вводе указанной команды с перечисленными аргументами нужно будет подтверждение. Внимание! Для команд в <команда>() { _command_guard <команда> "$@"; } всё равно всегда нужно будет подтверждение (так вообще лучше не делать одновременно с указанными опасными аргументами).
Оболочка Bash хотяб 3.2
Терминал с поддержкой ANSI цветов (Почти все современные SSH клиенты).
- Классификация ПО
- Другое
- Операционная система
- Linux
- Набор технологий
- Bash, ANSI Escape Sequences, printf, Exit Codes