可能的方法

可能的方法

我通常使用“root”登录我的linux,但是我想让shell禁止我的危险命令fio --name=test --filename=/dev/nvme0n1,就像/dev/nvme0n1我的OS驱动器一样。

那么,如何配置我的 bashrc 以使 shell cmd 进行预检查,如果命令具有类似的字符nvme0n1,则禁止它。

我想使用别名来实现它。但是目前我无法在 .bashrc 中设置别名,如下所示:

alias "*/dev/nvme0n1*"="do not try it!!!"

答案1

评论太长:

我通常使用“root”登录我的Linux,但我想让shell禁止危险命令

最好的办法就是不要直接登录root。设置一个普通的非特权用户帐户和一个sudo政策允许该用户在必要时提升其权限。

仅使用该常规用户帐户登录。

这是大大减少可以成功运行的“危险”命令的数量并降低风险以及对您的系统和其他用户的数据造成的损害的最简单方法。

然后训练自己仅在sudo真正需要以 root 权限运行某些东西的少数场合使用。

这将有助于找到最好的补救措施:

打字前请三思


话虽如此,默认的命令别名:

alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'

例如 RHEL 和可能的其他操作系统为 root 启用以及--preserve-rootGNUrm设置的默认选项,这些确实有助于防止某些(常见/臭名昭著的)事故。

更复杂和/或更通用的防呆措施很困难:

  1. 首先,可预见的错误(您可以成功识别和捕捉的错误)是有限制的。

  2. 代价高昂的错误和打字错误的可能性是无限的。

  3. 你的“危险的”可能实际上是想要和需要做的事。


可能的方法

Zsh 有precmdpreexec钩子(而且该功能似乎以某种形式移植到了 bash这里)可用于在执行之前评估每个命令

您可以使用它来:

  • 在运行/拒绝命令之前对“危险选项”列表进行字符串匹配

  • 当满足某些条件时,显示(条件)确认提示,如下例所示:https://reespozzi.medium.com/cancel-a-terminal-command-during-preexec-zsh-function-c5b0d27b99fb#86cb

      # Sanity Checks
      preexec () { 
      if [[ ${CLUSTER} =~ "prod" || ${CLUSTER} =~ "production" ]];then
         if [[ ${1} =~ "delete" || ${1} =~ "edit" || ${1} =~ "uninstall" ]];then
         read -q "execStatus?-----  DETECTED PROD CONTEXT: Definitely execute command? [y/n]  ----- "
        if [[ ${execStatus} == "y" ]];then
           printf "\nExecuting...\n"
         else
           printf "\nCancelled $1... Refreshing shell."
           exec zsh
         fi
        else
          echo "Successfully parsed for: [delete, edit, uninstall], executing command in prod context..."
        fi
      fi
    }
    

根据您自己的需要进行调整。

请注意,过于频繁的确认提示会导致一个问题,那就是人类行为会开始将其视为例行公事,人们将不再仔细阅读它们而只是简单地确认,从而违背了他们的目的。

相关内容