всегда запрашивать пользователя перед выполнением команды в оболочке

10

Существует ли утилита, которая всегда запрашивает у пользователя подтверждение перед выполнением команды, аналогичной той, которая sudoзапрашивает пароль?

m33lky
источник
1
Вы действительно хотите это для любой команды? В том числе cdи ls?
Карстен Тиль
Я хотел бы иметь его в моих собственных псевдонимах в .bashrc.
m33lky

Ответы:

9

Вы хотите, чтобы это работало без ввода дополнительной команды, например

$ 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.

Mikel
источник
Я хотел бы получить подтверждение только для одной команды, которая всегда вызывает у меня головную боль. Как будет выглядеть сценарий?
Даниэль
10

Я немного поиграл с 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к Enter, yes, Enter- вы будете вводить его в целом, даже не пытаясь потратить некоторое время на проверке того, что вы действительно хотите эту команду для выполнения. Это контрпродуктивно и вам не поможет.

ulidtko
источник
Остановки на Allow? 1) yes 2) no #? ни , yesни noработа не вызывает бесконечный цикл (Debian 8)
vladkras
@vladkras прочитать help select: вы должны ввести 1или 2вместо yesили no. Автоматическая повторная попытка для недопустимых вводов - это предполагаемое поведение (чтобы создателю сценария не приходилось заново изобретать whileсебя, сохраняя краткость и ясность), а ввод EOF завершает цикл. Зная это, вы можете сами убедиться, что приведенный выше скрипт работает. Я не буду изменять его, так как в любом случае это грубое доказательство концепции.
ulidtko
это правда. Я был смущен вашим y e s Enterпримером
vladkras