几周前,一位高级团队成员意外删除了一个重要的 oracle 数据库文件 (.dbf)。幸运的是,我们可以使用前几天保存的备份文件来恢复系统。
看到这种情况后,我决定实现一个解决方案,以便在提示符下键入 rm
命令时至少进行双重确认。 (检查超过 rm -i
)
即使我们将 rm -i
作为默认别名,但超快速的键盘手通常会像那个成员一样犯错误,包括我。
首先,我将(通过使用别名)基本 rm 命令替换为特定的 bash 脚本文件,如果目标与 oracle 数据库路径或文件相关,该脚本文件会多次打印和确认。 简单来说,脚本在运行rm之前作为过滤器运行。如果与oracle无关,rm会正常运行。
在实现过程中,我认为大部分功能都运行良好,因为除了一个问题外,我只期望用户提示环境。
如果在其他脚本(提供的 oracle、其他供应商修改 oracle 路径、安装程序等)或程序(通过使用系统调用)中调用 rm 命令。
我如何区分这种情况? 如果上面提供的脚本遇到修改过的 rm,该执行将不再继续。
你有更复杂的方法吗?
相信大部分读者都能看懂我偷懒的解释。 如果您无法从上方看到清晰的风景,请告诉我。我会详细说明。
最佳答案
我们在 man bash
读取:
Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt.
然后如果您使用alias
使rm
调用您的shell 脚本,其他脚本默认不会使用它。如果这是您想要的,那么您就已经安全了。
问题是如果您希望您的 rm 版本被脚本调用并在它发生时做一些聪明的事情。别名对于前者来说还不够;即使将 rm
放在 $PATH
下的某处,对于显式调用 /bin/rm
的程序来说也是不够的。对于不是 shell 脚本的程序,unlink
系统调用比 system("rm ...")
更可能被使用。
我认为,为了使整个“安全 rm”有用,它应该避免提示,即使是在交互调用时也是如此。每个用户都会养成对它说"is"的习惯,并且没有已知的解决方法。可能有用的方法是将文件移动到回收站而不是删除,从而使损坏易于撤消(我似乎记得,已经准备好为此使用解决方案)。
关于linux - 我想通过使用 bash 脚本获得 rm 命令过滤器的提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14439126/