一、缘由:

    

  最近看到这则新闻,很是悲伤,因为我最近也在用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 /*?

[rm] Linux 防止"rm -rf /" 误删除的更多相关文章

  1. 高性能Linux服务器 第6章 ext3文件系统反删除利器ext3grep extundelete工具恢复rm -rf 误删除的文件

    高性能Linux服务器 第6章  ext3文件系统反删除利器ext3grep  extundelete工具恢复rm -rf 误删除的文件 只能用于ext3文件系统!!!!!!!高俊峰(高性能Linux ...

  2. 使用trash-cli防止rm -rf 误删除带来的灾难(“事前”非“事后”)

    trash-cli是一个使用 python 开发的软件包,包含 trash-put.restore-trash.trash-list.trash-empty.trash-rm等命令,我们可以通过这写命 ...

  3. 禁用Linux bash rm --force

    防止无意的Linux bash rm --force 二.禁用rm -rf 因为rm -rf 删除文件的时候,经常会不小心将系统文件或者多个有用的目录删除掉.有两种方法:1,每次删除都用-i(inte ...

  4. Linux中rm命令详解

    linux下rm命令使用详解---linux删除文件或目录命令 用户可以用rm命令删除不需要的文件.该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除 ...

  5. Linux指令--rm, rmdir

    rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变.rm是一个危险的命令,使用的时 ...

  6. 【Linux】- rm命令

    Linux rm命令用于删除一个文件或者目录. 语法 rm [options] name... 参数: -i 删除前逐一询问确认. -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认. -r 将目 ...

  7. linux 重写rm命令

    重写rm命令 replease rm to trash   必须使用root编辑/etc/bashrc vim /etc/bashrc 在最后面增加如下脚本 saferm () { if [ ! -d ...

  8. 关于linux shell编程,alias rm='cp $@ ~/backup; rm $@'

    书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp $@ ~/backup; ...

  9. rm 、git rm 、git rm --cached的区别

    rm 删除文件 git rm git rm 当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用git rm git rm file = rm file+ git add f ...

随机推荐

  1. JQuery之滑动幻灯片插件Easy Slider初体验

    Easy Slider 是一个滑动幻灯片插件,支持任何图片或内容,可以实现横向或纵向滑动.它拥有一系列丰富的参数设置,可通过CSS来进行完全的控制.基本上只需要引入这个插件后,设置好内容,然后样式化C ...

  2. jQuery - 设置内容和属性

    设置内容 - text().html() 以及 val() 我们将使用前一章中的三个相同的方法来设置内容: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容( ...

  3. RedHat Linux下利用sersync进行实时同步数据

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://linux5588.blog.51cto.com/65280/772054 拓扑图 ...

  4. ES questions

    Be Careful of Cardinality Numeric and date fields are indexed in such a way that ranges are efficien ...

  5. 查看jquery绑定的事件函数

    作为技术狂热分子的职业本能,看到一个技术产品的功能,总会忍不住想知道它是怎么被实现的.比如我每每看到别人网站一个很炫的界面或者很酷的功能,就忍不住打开了浏览器的控制台... 好,不扯远,说说当你想看到 ...

  6. Windows帐户类型

    摘自:http://blog.csdn.net/shineorrain/article/details/18181707 LocalSystem   账户  LocalSystem是预设的拥有本机所有 ...

  7. CSS控制print打印样式

    来源:http://blog.csdn.net/pangni/article/details/6224533 一.添加打印样式 1. 为屏幕显示和打印分别准备一个css文件,如下所示:   用于屏幕显 ...

  8. OpenJudge计算概论-求出e的值

    /*======================================================================== 求出e的值 总时间限制: 1000ms 内存限制: ...

  9. RSA非对称加密 php的openssl实现

    <?php /** * 使用openssl实现非对称加密 * @since 2010-07-08 */ class Rsa { /** * private key */ private $_pr ...

  10. android 添加依赖的库文件

    Notpad: 2016-3-16: 1.android 添加依赖的库文件 右键自己的项目 -> properties ->android ->在Library处点击add -> ...