[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

相關文章
相關標籤/搜索