siempre solicite al usuario antes de ejecutar un comando en el shell

10

¿Existe alguna utilidad que siempre solicite confirmación al usuario antes de ejecutar un comando similar al que sudosolicita la contraseña?

m33lky
fuente
1
¿Realmente quieres eso para cualquier comando? Incluyendo cdy ls?
Carsten Thiel
Me gustaría tenerlo en mis propios alias en .bashrc.
m33lky

Respuestas:

9

¿Desea que funcione sin escribir un comando adicional, por ejemplo,

$ rm file

O solo cuando el usuario escribe algo como

$ confirm rm file

O solo cuando el usuario intenta ejecutar ciertos comandos, p. Ej.

$ rm file

pero no para

$ echo "Hello"

Si la opción 1, eso se puede hacer usando el enlace preexec en zsh, o la trampa DEBUG en bash.

Si es la opción 2, coloque algo como esto en /etc/bash.bashrcotro archivo de inicio de 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 la opción 3, se puede modificar el confirmscript de arriba, o, algunos comandos tienen la opción de pedir antes de hacer algo, por ejemplo rm -i. Se puede poner alias rm='rm -i'en /etc/bash.bashrc.

Mikel
fuente
Me gustaría la confirmación solo para un solo comando que siempre me da dolor de cabeza. ¿Cómo se vería el guión?
Danijel
10

He jugado un poco con bash y descubrí un truco por el cual esto podría ser posible.

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

Puede guardar este script en, digamos, confirm-any-command.shy sourceen su bashrc. Le pedirá confirmación de cada comando que intentará ejecutar.

Tenga en cuenta que esto no es más que un truco de prueba de concepto; Dudo que realmente pueda ser útil de esta forma. Si tiene que confirmar todos y cada uno de los comandos que escribe, muy pronto adquirirá el hábito de presionar automáticamente "sí" después de cada comando. Su mapeo mental "fin de comando" cambiará de simplemente Entera Enter, yes, Enter- se le escribiéndolo en su conjunto, ni siquiera tratar de pasar algún tiempo en verificar que realmente quiere este comando a ejecutar. Esto es contraproducente y no te ayudará.

ulidtko
fuente
Se detiene en Allow? 1) yes 2) no #? ninguno yes, ni noel trabajo que causa bucle infinito (Debian 8)
vladkras
@vladkras lee help select: se supone que debes ingresar 1o en 2lugar de yeso no. El reintento automático para entradas no válidas es el comportamiento previsto (para que el escritor de guiones no tenga que reinventarse a whilesí misma, conservando la concisión y la claridad), y la entrada EOF termina el ciclo. Sabiendo eso, puedes comprobar que el script anterior funciona. No lo modificaré, ya que de todos modos es una cruda prueba de concepto.
ulidtko
es verdad. Tu y e s Enterejemplo me confundió
vladkras