我如何防止意外 rm -rf /*?

我如何防止意外 rm -rf /*?

我只是rm -rf /*不小心跑了,但我的意思是rm -rf ./*(注意斜线后面的星号)。

alias rm='rm -i'并且--preserve-root默认情况下没有拯救我,那么有什么自动保护措施吗?


我不是 root 用户,因此立即取消了命令,但某个地方的权限有所放松,因为我注意到我的 Bash 提示符已经损坏。我不想依赖权限,也不想成为 root 用户(我可能会犯同样的错误sudo),也不想因为系统中某个文件丢失而寻找神秘的错误,因此,备份和sudo很好,但对于这种特定情况,我希望有更好的方法。


关于三思而后行,用脑子。我实际上在用脑子!但我用它解决一些涉及 10 种不同事物的复杂编程任务。我深深地沉浸在这项任务中,脑力已经不足以检查标志和路径,我甚至不考虑命令和参数,我考虑的是“清空当前目录”之类的操作,我大脑的不同部分将它们转换为命令,有时会犯错误。我希望计算机能够纠正它们,至少是那些危险的。

答案1

我遵循的技巧之一是#在使用命令时将其放在开头rm

root@localhost:~# #rm -rf /

这可以防止意外执行rm错误的文件/目录。一旦验证,#从开头删除。这个技巧很有效,因为在 Bash 中,以 开头的单词#会导致该单词和该行上的所有剩余字符被忽略。因此命令被忽略了。

或者

如果您想阻止任何重要目录,还有一个技巧。

在该目录中创建一个名为的文件-i。如何创建这样一个奇怪的文件?使用touch -- -itouch ./-i

现在尝试rm -rf *

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

此处*将扩展-i为命令行,因此您的命令最终变为rm -rf -i。因此命令将在删除前提示。您可以将此文件放在您的/、、等中/home//etc/

或者

用作--preserve-root的一个选项。在较新的软件包中包含的rm中,此选项是默认选项。rmcoreutils

--preserve-root
              do not remove `/' (default)

或者

使用安全保证

摘自网站:

Safe-rm 是一种安全工具,旨在通过用包装器替换 /bin/rm 来防止意外删除重要文件,该包装器会根据可配置的黑名单(包含永远不应删除的文件和目录)检查给定的参数。

尝试删除这些受保护文件或目录的用户将无法执行此操作,而是会显示一条警告消息:

$ rm -rf /usr
Skipping /usr

答案2

你的问题:

我只是不小心运行了 rm -rf /*,但我的意思是 rm -rf ./*(注意斜线后的星号)。

解决方案:不要这样做!按照惯例,不要./在路径开头使用。斜线不会给命令增加任何价值,只会引起混淆。

./*含义与 相同*,因此上述命令最好写成:

rm -rf *

这是一个相关的问题。我经常看到以下表达式,其中有人认为FOO设置为类似于/home/puppies。事实上,我今天才在一家主要软件供应商的文档中看到这一点。

rm -rf $FOO/

但如果FOO没有设置,则将计算为rm -rf /,这将尝试删除系统上的所有文件。结尾的斜杠是不必要的,因此在实践中不要使用它。

下面的操作可以达到同样的效果,而且不太可能损坏您的系统:

rm -rf $FOO

我是通过惨痛经历才学到这些技巧的。14 年前,当我拥有第一个超级用户帐户时,我意外地rm -rf $FOO/从 shell 脚本中运行并破坏了一个系统。其他 4 位系统管理员看到后说:“是的。每个人都会这样做一次。现在这是您的安装介质(36 张软盘)。快去修复它。”

其他人推荐使用--preserve-root和等解决方案safe-rm。但是,这些解决方案并不适用于所有 Un*xe 变体,并且可能无法在 Solaris、FreeBSD 和 MacOSX 上使用。此外,safe-rm要求您在使用的每个 Linux 系统上安装其他软件包。如果您依赖safe-rm,当您开始一份新工作而它们尚未safe-rm安装时会发生什么?这些工具只是一种拐杖,最好依赖已知的默认值并改善您的工作习惯。

答案3

由于这是关于“Serverfault”的,我想说的是:

如果你有几十台或更多的服务器,并且有一个较大的管理员/用户团队,某人是要去往rm -rfchown错误的目录。

您应该制定一个计划,以尽可能最短的 MTTR 恢复受影响的服务。

答案4

正如您所提到的,您可以随时使用别名:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

rm -fr /*您还可以将它与命令行 Twitter 客户端集成,以提醒您的朋友您几乎是如何以root 身份擦除硬盘并自取其辱的。

相关内容