Fordern Sie den Benutzer immer auf, bevor Sie einen Befehl in der Shell ausführen

9

Gibt es ein Dienstprogramm, das den Benutzer immer zur Bestätigung auffordert, bevor ein Befehl ausgeführt wird, der der Art und Weise ähnelt, wie sudonach einem Kennwort gefragt wird?

m33lky
quelle
1
Willst du das wirklich für irgendeinen Befehl? Einschließlich cdund ls?
Carsten Thiel
Ich möchte es in meinen eigenen Aliasnamen in .bashrc haben.
m33lky

Antworten:

8

Möchten Sie, dass es funktioniert, ohne einen zusätzlichen Befehl einzugeben, z

$ rm file

Oder nur, wenn der Benutzer so etwas eingibt

$ confirm rm file

Oder nur, wenn der Benutzer versucht, bestimmte Befehle auszuführen, z

$ rm file

aber nicht für

$ echo "Hello"

Bei Option 1 kann dies mit dem Preexec-Hook in zsh oder dem DEBUG-Trap in bash erfolgen.

Wenn Option 2, fügen Sie so etwas in eine /etc/bash.bashrcandere Shell-Startdatei ein.

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
}

Wenn Option 3, können Sie das confirmobige Skript ändern , oder einige Befehle haben eine Option, die Sie fragen müssen, bevor Sie etwas tun, z rm -i. Sie könnten setzen alias rm='rm -i'in /etc/bash.bashrc.

Mikel
quelle
Ich möchte die Bestätigung nur für einen einzigen Befehl, der mir immer Kopfschmerzen bereitet. Wie würde das Skript aussehen?
Danijel
10

Ich habe ein bisschen mit Bash gespielt und einen Hack herausgefunden, durch den dies möglich gemacht werden könnte.

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

Sie können dieses Skript beispielsweise unter confirm-any-command.shund sourcein Ihrem speichern bashrc. Es wird um Bestätigung jedes Befehls gebeten, den Sie ausführen möchten.

Bitte beachten Sie, dass dies nichts weiter als ein Proof-of-Concept-Hack ist. Ich bezweifle, dass es in dieser Form wirklich nützlich sein kann. Wenn Sie jeden von Ihnen eingegebenen Befehl bestätigen müssen, werden Sie sehr bald die Gewohnheit haben, nach jedem Befehl automatisch "Ja" zu drücken. Ihre mental mapping für „Ende des Befehls“ von nur ändern Enterzu Enter, yes, Enter- Sie werden es als Ganzes werden eingeben, haben nicht einmal versucht , einige Zeit zu verbringen auf Überprüfung, ob Sie wirklich diesen Befehl ausführen soll. Dies ist kontraproduktiv und hilft Ihnen nicht.

ulidtko
quelle
Stoppt Allow? 1) yes 2) no #? weder yesnoch noarbeitet, was zu einer Endlosschleife führt (Debian 8)
vladkras
@vladkras lesen help select: du sollst eingeben 1oder 2eher als yesoder no. Die automatische Wiederholung für ungültige Eingaben ist beabsichtigtes Verhalten (damit die Skriptschreiberin sich nicht neu erfinden whilemuss, um Prägnanz und Klarheit zu bewahren), und die EOF-Eingabe beendet die Schleife. Wenn Sie das wissen, können Sie selbst überprüfen, ob das obige Skript funktioniert. Ich werde es nicht modifizieren, da es sowieso ein grober Proof of Concept ist.
Ulidtko
das stimmt. Ich war durch Ihr y e s EnterBeispiel verwirrt
vladkras