sempre solicite ao usuário antes de executar um comando no shell

10

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

m33lky
fonte
11
Você realmente quer isso para qualquer comando? Incluindo cde ls?
Carsten Thiel
Gostaria de tê-lo em meus próprios apelidos em .bashrc.
m33lky

Respostas:

9

Deseja 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 certos 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 a interceptação DEBUG no bash.

Se a opção 2, coloque algo assim /etc/bash.bashrcou em 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 confirmscript acima, ou, alguns comandos têm uma opção para perguntar antes de fazer algo, por exemplo rm -i. Você poderia colocar alias rm='rm -i'em /etc/bash.bashrc.

Mikel
fonte
Gostaria da confirmação apenas de um único comando que sempre me dá dor de cabeça. Como seria o script?
Danijel
10

Eu brinquei 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 esse script em, digamos, confirm-any-command.she sourceno seu bashrc. Ele solicitará a confirmação de cada comando que você tentará executar.

Observe que isso nada mais é do que um truque de prova de conceito; Duvido que possa realmente ser útil nesta forma. Se você precisar confirmar todos os comandos digitados, em breve adquirirá o hábito de pressionar automaticamente "yes" após cada comando. Seu mapeamento mental para "final de comando" vai mudar a partir de apenas Entera Enter, yes, Enter- você vai estar digitando-o como um todo, nem sequer tentando passar algum tempo na verificação de que você realmente quer este comando para executar. Isso é contraproducente e não o ajudará.

ulidtko
fonte
Pára em Allow? 1) yes 2) no #? nenhum yesnem notrabalho causando loop infinito (Debian 8)
vladkras
@ Vladlad ler help select: você deve inserir 1ou 2melhor do que yesou no. A nova tentativa automática para entradas inválidas é o comportamento pretendido (para que o escritor do script não precise se reinventar while, mantendo a concisão e a clareza), e a entrada EOF finaliza o loop. Sabendo disso, você pode verificar se o script acima funciona. Não vou modificá-lo, pois é uma prova grosseira de conceito.
ulidtko
isso é verdade. Fiquei confuso com o seu y e s Enterexemplo
vladkras