【问题标题】:I want to get a tip of rm command filter by using bash script我想通过使用 bash 脚本获得 rm 命令过滤器的提示
【发布时间】:2013-01-21 12:55:11
【问题描述】:

几周前,一位高级团队成员意外删除了一个重要的 oracle 数据库文件 (.dbf)。幸运的是,我们可以使用前几天保存的备份文件来恢复系统。

看到这种情况后,我决定实施一个解决方案,在提示符下键入rm 命令时至少进行双重确认。 (检查超过rm -i

即使我们默认使用别名 rm -i,超快速键盘手通常也会像该成员一样犯错误,包括我在内。

起初,我将基本 rm 命令替换(通过使用别名)到一个特定的 bash 脚本文件,该文件会打印并多次确认目标是否与 oracle 数据库路径或文件相关。 简单来说,该脚本在操作rm之前作为过滤器操作。如果与oracle无关,则rm正常运行。

在实现时,我认为大多数功能都运行良好,因为我期望除了一个问题之外只有用户提示环境。

如果在其他脚本(提供的 oracle、其他供应商修改 oracle 路径、安装程序等)或程序(通过使用系统调用)中调用 rm 命令。

  1. 我如何区分这种情况? 如果上面提供的脚本遇到了修改过的 rm,则该执行将不再继续。

  2. 你有更复杂的方法吗?

相信大部分读者都能理解我懒惰的解释。 如果您无法从上面看到清晰的风景,请告诉我。我会详细说明。

【问题讨论】:

    标签: linux bash rm


    【解决方案1】:

    我们在man bash阅读:

    当 shell 不是交互式时,别名不会展开,除非 expand_aliases shell 选项是使用 shopt 设置的。

    那么如果你使用aliasrm 调用你的shell 脚本,其他脚本默认不会使用它。如果这是你想要的,那么你就已经安全了。

    问题是如果您希望您的 rm 版本被脚本调用并在它发生时做一些聪明的事情。 Alias 对前者来说是不够的;即使将rm 放在$PATH 之下的某个位置,对于显式调用/bin/rm 的程序来说也是不够的。对于不是 shell 脚本的程序,unlink 系统调用比system("rm ...") 更可能被使用。

    我认为要使整个“安全 rm”变得有用,即使交互调用它也应该避免提示。每个用户都会养成对它说“是”的习惯,并且没有已知的解决方法。可行的方法是将文件移动到回收站而不是删除,从而使损坏易于撤消(我似乎记得,有现成可用的解决方案)。

    【讨论】:

      【解决方案2】:

      答案在alias 手册页中:

                Note  aliases  are  not  expanded  by default in non-interactive
                shell, and it can be enabled by setting the expand_aliases shell
                option using shopt.
      

      通过man alias 自行检查;)

      不管怎样,我会按照你选择的方式去做

      【讨论】:

        【解决方案3】:

        区分情况:您可以创建一个环境变量 APPL,它将设置为 export APPL="DATABASE 。在您自定义的rm 脚本中,仅当APPLDATABASE(表示与数据库相关的脚本)时执行双重检查,否则表示rm 调用来自其他脚本。

        【讨论】:

          【解决方案4】:

          如果您使用的是bash,您可以导出您的 shell 函数,这样也可以在脚本中使用它。

          #!/usr/bin/env bash
          
          # Define a replacement for `rm` and export it. 
          rm() { echo "PSYCH."; }; export -f rm
          

          Shell 函数优先于内置函数和外部实用程序,因此仅使用 rm 甚至脚本也会调用该函数 - 除非它们通过调用 /bin/rm ...command rm ... 显式绕过该函数。

          将上述内容(使用您的rm() 的实际实现)放在每个用户的~/.bashrc 文件中,或者放在系统范围的bash 配置文件中——遗憾的是,它的位置不是标准化的(例如:Ubuntu:/etc/bash.bashrc; Fedora /etc/bashrc)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-01-31
            • 2014-11-02
            • 1970-01-01
            • 2019-02-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多