[rm] Linux 防止"rm -rf /" 误删除

引觉得戒!!!html

1、原因:
    
  最近看到这则新闻,非常悲伤,由于我最近也在用ansible;然而这一错误源自Ansible上糟糕的代码设计,这款Linux实用工具被用于在多台不一样服务器上自动执行脚本。shell

  开发者解释到,实际参数应该是“rm -rf {foo}/{bar}”,foo和bar是脚本中动态传递的两个变量。然而因为变量处理出错,通用语法未能成功在bash命令中插值,因此最终指令就变成了可怕的“rm -rf /”。ubuntu

“rm -rf /”意味着擦除根路径“/”下挂载的全部内容而无需询问。centos

  之前一个主管说过,在你不充分了解某个工具的原理的时候,不要太过相信依赖他。哪怕本身去写个简陋的,能够看到源码,也是比较靠谱的。深信不疑!bash

2、解决办法:服务器

  为了不误删根目录,或者重要的文件,整理了如下方法:ide

一、safe-rm工具

  safe-rm 是一个开源软件用来替代不×××全的rm,能够在/etc/safe-rm.conf中配置路径黑名单,定义哪些不能被safe-rm删除。设计

能够将 safe-rm 改名为 rm 并放在 $PATH 中比 原rm 程序靠前的位置。一些脚本中使用彻底路径/bin/rm则不会受此影响。 code

$ rm -rf /etc/
safe-rm: skipping /etc/
官方地址:http://freecode.com/projects/safe-rm,ubuntu能够直接apt-get安装,centos要下载源码安装

二、创建回收站机制

  它并不真正执行删除操做,而是将文件移动到一个特定目录,能够设置定时清楚回收站,或者在回收站里面的文件大小达到必定容量时(或者用时间作判断)执行删除操做以腾出空间。

能够写个shell脚本替换rm命令,或者在须要删除文件的时候使用mv命令将文件移动到回收站。  

1) 在/home/username/ 目录下新建一个目录,命名为:.trash

2)在/home/username/tools/目录下,新建一个shell文件,命名为: remove.sh

TRASH_DIR="/home/username/.trash"  

for i in $*; do  
    STAMP=`date +%s`  
    fileName=`basename $i`  
    mv $i $TRASH_DIR/$fileName.$STAMP  
done

3)修改~/.bashrc, 增长一行

alias rm="sh /home/username/tools/remove.sh"

用咱们自建的remove.sh替代rm命令

4)设置crontab,按期清空垃圾箱,如:

0 0 rm -rf /home/username/.trash/

天天0点清空垃圾箱

5)source ~/.bashrc 使替换当即生效

三、注意脚本中rm -rf 变量的使用

  在脚本尽可能不要使用 rm -rf $FOO/, 请使用 rm -rf $FOO;另外删除尽可能不要写相对路径,不要带变量。

四、根文件系统设置只读挂载

noauto,ro

五、各类备份

  能够异地远程备份重要的数据,采用dump的增量备份机制,LVM快照,虚拟化环境中的快照、raid5等等。

原文:https://www.cnblogs.com/langdashu/p/5404595.html

附录:How do I prevent accidental rm -rf /*? http://serverfault.com/questions/337082/how-do-i-prevent-accidental-rm-rf

相关文章
相关标签/搜索