Существует ли утилита, которая всегда запрашивает у пользователя подтверждение перед выполнением команды, аналогичной тому, как sudo
запрашивает пароль?
Вы хотите, чтобы это работало без ввода дополнительной команды, например
$ rm file
Или только когда пользователь печатает что-то вроде
$ confirm rm file
Или только когда пользователь пытается выполнить определенные команды, например
$ rm file
, но не для
$ echo "Hello"
Если опция 1, это можно сделать с помощью перехвата preexec в zsh или ловушки DEBUG в bash.
Если вариант 2, поместите что-то вроде этого в /etc/bash.bashrc
или другой файл запуска оболочки.
confirm() {
echo -n "Do you want to run $*? [N/y] "
read -N 1 REPLY
echo
if test "$REPLY" = "y" -o "$REPLY" = "Y"; then
"$@"
else
echo "Cancelled by user"
fi
}
Если выбрана опция 3, вы можете изменить сценарий confirm
, описанный выше, или у некоторых команд есть возможность спросить, прежде чем что-то делать, например, rm -i
. Вы можете поместить alias rm='rm -i'
в /etc/bash.bashrc
.
Я немного поиграл с bash и понял, как это можно сделать.
#!/bin/bash
debug_trap () {
echo "executing $BASH_COMMAND"
echo "Allow?"
select choice in yes no
do
if [ "$choice" = "yes" ]
then break
elif [ "$choice" = "no" ]
then return 1
fi
done
}
shopt -s extdebug
trap debug_trap DEBUG
Вы можете сохранить этот сценарий, скажем, confirm-any-command.sh
и source
в своем bashrc
. Он будет запрашивать подтверждение каждой команды, которую вы попытаетесь выполнить.
Пожалуйста, обратите внимание, что это не что иное, как проверка концепции; Я сомневаюсь, что это действительно может быть полезным в этой форме. Если вам придется подтверждать каждую введенную вами команду, вы очень скоро приобретете привычку автоматически нажимать «да» после каждой команды. Ваше умственное отображение «конца команды» изменится с Enter kbd> на Enter kbd>, y kbd> e kbd> s kbd>, Enter kbd> - вы будете печатать его целиком, даже не пытаясь потратить некоторое время на проверку того, что вы действительно хотите, чтобы эта команда выполнялась. Это контрпродуктивно и вам не поможет.