invitez toujours l'utilisateur avant d'exécuter une commande dans le shell

10

Existe-t-il un utilitaire qui invite toujours l'utilisateur à confirmer avant d'exécuter une commande similaire à la façon dont le sudomot de passe est demandé?

m33lky
la source
1
Voulez-vous vraiment cela pour n'importe quelle commande? Y compris cdet ls?
Carsten Thiel
Je voudrais l'avoir dans mes propres alias en .bashrc.
m33lky

Réponses:

9

Voulez-vous que cela fonctionne sans taper une commande supplémentaire, par exemple

$ rm file

Ou seulement lorsque l'utilisateur tape quelque chose comme

$ confirm rm file

Ou seulement lorsque l'utilisateur essaie d'exécuter certaines commandes, par exemple

$ rm file

mais pas pour

$ echo "Hello"

Si l'option 1, cela peut être fait en utilisant le hook preexec dans zsh, ou le trap DEBUG dans bash.

Si l'option 2, mettez quelque chose comme ça dans /etc/bash.bashrcou un autre fichier de démarrage du 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
}

Si l'option 3, vous pouvez modifier le confirmscript ci-dessus, ou, certaines commandes ont une option à demander avant de faire quelque chose, par exemple rm -i. Vous pouvez mettre alias rm='rm -i'en /etc/bash.bashrc.

Mikel
la source
Je voudrais la confirmation uniquement pour une seule commande qui me donne toujours mal à la tête. À quoi ressemblerait le script?
Danijel
10

J'ai un peu joué avec bash et trouvé un hack par lequel cela pourrait être rendu possible.

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

Vous pouvez enregistrer ce script sous, disons, confirm-any-command.shet sourcedans votre fichier bashrc. Il vous demandera de confirmer chaque commande que vous tenterez d'exécuter.

Veuillez noter que ce n'est rien de plus qu'un hack de preuve de concept; Je doute que cela puisse vraiment être utile sous cette forme. Si vous devez confirmer chaque commande que vous tapez, vous allez très vite prendre l'habitude de cliquer automatiquement sur "oui" après chaque commande. Votre cartographie mentale pour « fin de la commande » passera de juste Enterà Enter, yes, Enter- vous serez en train de taper dans son ensemble, ne même pas essayer de passer un peu de temps à vérifier que vous vraiment voulez que cette commande à exécuter. C'est contre-productif et ne vous aidera pas.

ulidtko
la source
Arrête sur Allow? 1) yes 2) no #? ni yesni notravail entraînant boucle infinie (Debian 8)
vladkras
@vladkras lire help select: vous êtes censé entrer 1ou 2plutôt que yesou no. La nouvelle tentative automatique pour les entrées non valides est un comportement voulu (de sorte que le scripteur n'a pas à se réinventer while, en conservant la concision et la clarté), et l'entrée EOF termine la boucle. Sachant cela, vous pouvez vérifier vous-même que le script ci-dessus fonctionne. Je ne vais pas le modifier, car c'est une preuve de concept grossière de toute façon.
ulidtko
c'est vrai. J'ai été confus par votre y e s Enterexemple
vladkras