在犯下删除整个文件系统这个臭名昭著的错误之后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
对于没有sudo
1和标志的情况,-f
最好添加alias
rm
使 标志成为默认标志的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
选项的情况下删除。
默认情况下,有三种保护措施可以防止以这种方式删除系统:
- 权限 - 普通用户无法删除重要文件。你使用 sudo 绕过了这个问题
- 目录 - 默认情况下 rm 不会删除目录。您可以使用 -r 标志绕过此问题
- 写保护文件 - 默认情况下,rm 会在删除写保护文件之前要求确认(这不会阻止所有损坏,但可能会在系统无法恢复之前提供提示)。您可以使用 -f 标志绕过此保护
要删除文件夹中的所有内容,rm /path/to/folder/*
请执行 而不是运行rm -rf /path/to/folder
,mkdir /path/to/folder
因为这将触发--preserve-root
保护并删除文件夹中的所有点文件
答案4
嗯,简短的回答就是不要运行这样的命令。
长话短说,这是定制的一部分。本质上,这里有两个因素在起作用。一是您可以自由修改所有文件。
第二,rm 命令提供了有用的语法糖来删除文件夹下的所有文件。
实际上,这可以重新表述为 Unix 机器的一个简单原则。一切皆文件。为了让事情变得更好,有访问控制,但这些会被你使用的
须藤
我想您可以添加一个别名或函数来确保这永远不会运行。