sempre avisa o usuário antes de executar um comando no shell

6

Existe um utilitário que sempre solicita ao usuário a confirmação antes de executar um comando similar ao modo como sudo pede senha?

    
por m33lky 19.01.2011 / 05:33

2 respostas

7

Você quer que ele funcione sem digitar um comando extra, por exemplo,

$ rm file

Ou apenas quando o usuário digita algo como

$ confirm rm file

Ou apenas quando o usuário tenta executar determinados comandos, por exemplo,

$ rm file

mas não para

$ echo "Hello"

Se a opção 1, isso pode ser feito usando o gancho preexec no zsh, ou o trap DEBUG no bash.

Se a opção 2, colocar algo assim em /etc/bash.bashrc ou outro arquivo de inicialização do shell.

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
}

Se a opção 3, você pode modificar o script confirm acima, ou, alguns comandos têm uma opção para perguntar antes de fazer algo, por exemplo %código%. Você poderia colocar rm -i em alias rm='rm -i' .

    
por Mikel 19.01.2011 / 12:24
10

Eu joguei um pouco com o bash e descobri um truque pelo qual isso poderia ser possível.

#!/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

Você pode salvar este script em, digamos, confirm-any-command.sh e source em bashrc . Ele pedirá a confirmação de cada comando que você tentará executar.

Por favor, note que isso não é nada mais do que um hack de prova de conceito; Eu duvido que possa realmente ser útil neste formulário. Se você tiver que confirmar todos os comandos que digitar, você logo adquirirá o hábito de acertar automaticamente "sim" após cada comando. Seu mapeamento mental para "fim de comando" mudará de apenas Enter para Enter , y e s , Enter - você estará digitando como um todo, nem mesmo tentando gastar algum tempo na verificação de que você realmente deseja que este comando seja executado . Isso é contraproducente e não irá ajudá-lo.

    
por ulidtko 19.01.2011 / 12:23