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


    一、缘由:

        

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

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

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

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

    二、解决办法:

      为了避免误删根目录,或者重要的文件,整理了以下方法:

    1、safe-rm

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

    可以将 safe-rm 更名为 rm 并放在 $PATH 中比 原rm 程序靠前的位置。一些脚本中使用完全路径/bin/rm则不会受此影响。 

    $ rm -rf /etc/
    safe-rm: skipping /etc/

    官方地址:http://freecode.com/projects/safe-rm,ubuntu可以直接apt-get安装,centos要下载源码安装。

    2、建立回收站机制

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

    可以写个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 使替换立即生效

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

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

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

    noauto,ro

    5、各种备份

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

    附录:How do I prevent accidental rm -rf /*?

     

  • 相关阅读:
    半夜的时候,干了个活,反了个小软件
    bzoj2243[SDOI2011]染色
    bzoj4034[HAOI2015]T2
    bzoj2661[BeiJing wc2012]连连看
    bzoj1406[AHOI2007]密码箱
    bzoj1452[JSOI2009]Count
    bzoj1934[Shoi2007]Vote 善意的投票
    bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会
    bzoj1293[SCOI2009]生日礼物
    bzoj1221[HNOI2001] 软件开发
  • 原文地址:https://www.cnblogs.com/langdashu/p/5404595.html
Copyright © 2020-2023  润新知