在 shell 中执行命令之前总是提示用户

m33*_*lky 10 command-line bash

是否有一个实用程序在执行类似于sudo要求输入密码的方式的命令之前总是提示用户确认?

uli*_*tko 10

我玩过 bash 并想出了一个可以使这成为可能的黑客。

#!/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
Run Code Online (Sandbox Code Playgroud)

您可以保存下,说这个剧本,confirm-any-command.shsource在它bashrc。它将要求确认您将尝试执行的每个命令。

请注意,这只不过是一个概念验证黑客;我怀疑它在这种形式中真的有用。如果你必须确认你输入的每一个命令,你很快就会养成在每个命令后自动点击“是”的习惯。您对“命令结束”的心理映射将从仅更改EnterEnter, yes, Enter- 您将输入它作为一个整体,甚至不要尝试花一些时间来验证您是否真的希望执行此命令。这是适得其反的,不会帮助你。


Mik*_*kel 9

你想让它在不输入额外命令的情况下工作吗,例如

$ rm file
Run Code Online (Sandbox Code Playgroud)

或者只有当用户输入类似

$ confirm rm file
Run Code Online (Sandbox Code Playgroud)

或者仅当用户尝试运行某些命令时,例如

$ rm file
Run Code Online (Sandbox Code Playgroud)

但不是为了

$ echo "Hello"
Run Code Online (Sandbox Code Playgroud)

如果选择 1,则可以使用 zsh 中的 preexec 钩子或 bash 中的 DEBUG 陷阱来完成。

如果选项 2,在/etc/bash.bashrc或其他 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
}
Run Code Online (Sandbox Code Playgroud)

如果选项 3,您可以修改confirm上面的脚本,或者,某些命令可以选择在做某事之前询问,例如rm -i. 你可以放进 alias rm='rm -i'/etc/bash.bashrc