为什么可以删除整个文件系统?

为什么可以删除整个文件系统?

在犯下删除整个文件系统这个臭名昭著的错误之后sudo rm -rf /*,我从造成的严重损害中恢复过来,并面对了我刚刚失去了 6 年寿命的现实,我开始想知道为什么会发生这种情况,以及如何防止这种错误发生。

有人向我建议的一个解决方案是从我的帐户撤销 root 访问权限,但这很不方便,因为很多命令都需要 root 访问权限,而当你每天必须运行几十个命令时,这会很烦人。

备份系统是显而易见的方法。但恢复备份也需要停机一段时间,并且根据系统的不同,停机时间可能是几天或几周,在某些情况下这可能是不可接受的。

我的问题是:当用户尝试删除文件系统时,为什么不实现确认?这样,当您真正想要这样做时,只需按 Y 或 Enter 即可,即使不这样做,至少您也不会丢失所有内容。

答案1

见面safe-rm,“包装命令rm以防止意外删除”:

safe-rm 通过使用包装器进行替换来防止意外删除重要文件,rm该包装器会根据可配置的黑名单(包含永远不应删除的文件和目录)检查给定的参数。

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

如果上面的安装链接对您不起作用,请使用sudo apt install safe-rm。默认配置已经包含系统目录,让我们尝试rm /*一下:

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var

如您所见,这将阻止您删除/home,我猜您的个人文件就存储在其中。但是,~如果您尝试直接删除它们,它不会阻止您删除或其任何子目录。要添加目录,~/precious_photos只需添加其绝对路径,并将波浪号解析为safe-rm的配置文件/etc/safe-rm.conf,例如:

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

rm对于没有sudo1和标志的情况,-f最好添加aliasrm使 标志成为默认标志的shell -i。此方法rm在删除每个文件之前询问它:

alias rm='rm -i'

类似有用的标志是-I,只是它只会在“删除三个以上的文件之前或递归删除时发出一次警告”,这“比 的侵入性更小-i,同时仍然可以防止大多数错误”:

alias rm='rm -I'

这些别名的普遍危险在于您很容易养成依赖它们来拯救您的习惯,但在使用不同的环境时可能会适得其反。


1:sudo忽略别名alias sudo='sudo ',可以通过定义来解决这个问题

答案2

确认已经存在,问题在于-f命令,即--force;当用户强制执行操作时,应该他们知道自己在做什么(显然总是会出现错误)。

一个例子:

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

它与选项不同--force:我不会收到任何确认并且文件将被删除。

问题在于了解命令及其参数,在man命令中进行更多导航(如果在教程中找到该命令也是如此)例如:第一次看到该命令时,tar xzf some.tar.gz我问自己,“这是什么xzf意思?”

然后我阅读了 tar 手册页并发现了它。

答案3

rm是一种低级系统工具。这些工具的构建尽可能简单,因为它们必须存在于任何系统中。rm预计具有众所周知的行为,尤其是确认提示,以便可以在脚本中使用。

rm /*无法在提示中添加特殊情况,因为 rm 命令无法以这种形式看到它。*通配符在传递给 之前由 shell 扩展rm,因此需要特殊情况的实际命令将是这样的rm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz。添加代码来检查这种情况(在不同的 Linux 上可能会有所不同)将是一项复杂的挑战,并且容易出现细微错误。标准 Linuxrm确实具有默认保护以防止系统破坏,方法是拒绝在/没有--no-preserve-root选项的情况下删除。

默认情况下,有三种保护措施可以防止以这种方式删除系统:

  1. 权限 - 普通用户无法删除重要文件。你使用 sudo 绕过了这个问题
  2. 目录 - 默认情况下 rm 不会删除目录。您可以使用 -r 标志绕过此问题
  3. 写保护文件 - 默认情况下,rm 会在删除写保护文件之前要求确认(这不会阻止所有损坏,但可能会在系统无法恢复之前提供提示)。您可以使用 -f 标志绕过此保护

要删除文件夹中的所有内容,rm /path/to/folder/*请执行 而不是运行rm -rf /path/to/foldermkdir /path/to/folder因为这将触发--preserve-root保护并删除文件夹中的所有点文件

答案4

嗯,简短的回答就是不要运行这样的命令。

长话短说,这是定制的一部分。本质上,这里有两个因素在起作用。一是您可以自由修改所有文件。

第二,rm 命令提供了有用的语法糖来删除文件夹下的所有文件。

实际上,这可以重新表述为 Unix 机器的一个简单原则。一切皆文件。为了让事情变得更好,有访问控制,但这些会被你使用的

须藤

我想您可以添加一个别名或函数来确保这永远不会运行。

相关内容