linux-alias方式防止根目录误删(本文档未测试)

参考:

rm是一个危险的命令,为了防止rm /这样的操作发生。我们可以在用户的家目录的.bashrc里将rm alisa一下,加上–preserve-root这个参数。其实除了rm外,另外几个命令也需要谨慎,如chgrp、chown、chmod总结一下,我们可以在.bashrc里加入如下alias:

1
2
3
4
alias chgrp='chgrp --preserve-root'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias rm='rm -i --preserve-root'

详细解释之根目录保护

有一定经验的系统管理员可能这个时候会想起来,rm 命令有一对专门针对根目录的选项 --preserve-root--no-preserve-root 。这对选项的意思是:

  • --preserve-root:保护根目录,这是默认行为。
  • --no-preserve-root:不保护根目录。

这对选项是后来添加到 rm 命令的。可能几乎每个系统管理员都犯过操作错误,而这其中删除过根目录的比比皆是(我就是一个)。出现这种情况的原因有几种:

  • 输入手误:比如本来想输入 rm /tmp/test.txt,结果不小心键盘打的飞起,多输入了一个空格变成: rm / tmp/test.txt 。看到根目录(/)后面的空格了么?!——这就是我当前自己亲手犯过的错误,而且是在生产服务器上。
  • 未正确初始化或命名错误的 shell 脚本变量:比如在脚本中,rm -rf /${tmp_dir},如果无论是 tmp_dir 变量没有正确赋值还是输入错误(原本或许是 tmpdir ?),那会导致什么?当然是删除根目录咯~

鉴于这种情况层出不穷,在 Linux 圈子几乎和“初学者如何退出 vi” 一样成为经典笑话了。所以,在 POSIX 第七版规范中,rm 命令添加--preserve-root 选项,并将其作为默认行为,以降低出现这种错误的可能。

但是,这个选项不能防范本文中所述的清除根目录下所有文件(/*)的操作。

有的同学可能要问,那为什么还会专门出现 --no-preserve-root 选项呢?这可能主要是出于 UNIX 哲学的考虑,给予你想要的一切权力,犯傻是你的事情,而不是操作系统的事情。万一,你真的想删除根目录下的所有文件呢?

你还别说,真有这种需求:比如你要清除一个 chroot 环境下的所有文件。 chroot 我们这里不多讲,它就是以一个目录作为“监狱”,该目录在逻辑上形成了新的“根目录”,在该监狱内的文件操作不能跨出该目录范畴。近些年流行的 Docker、LXC/LXD 之类的容器技术,都是一种 chroot 技术。