rm -rf /* 好凶,預防它的幾種辦法

如果不小心刪庫了,跑路是不可能的。

首先:感覺不對,立馬掐斷運行中的腳本,然後

保留案發現場:不要重啓服務器,不要斷開ssh連接會話。

查看被刪除了哪些文件:ls、cd + Tab 等 然後逐個裝回去。。。。用上傳下載、weget、別臺拷貝系統文件過來等。。。。

預防誤執行rm -rf /*

方案一:rm -rf 刪除目錄時要判斷目錄

#!/bin/bash

work_path=`pwd`

#如果目錄不爲空,才執行刪除操作
if [ ${work_path} != "" ];then
    rm -fr ${work_path}/*
fi

方案二:Shell 腳本指定 set -u

#!/bin/bash

echo $a
echo hello

可以發現,echo $a 輸出了一個空行,Bash 忽略了不存在的 $a,然後繼續執行echo hello

最好是遇到變量不存在,腳本應該報錯,而不是一聲不響地往下執行。

set -u 就用來改變這種行爲,在腳本加上它,遇到不存在的變量就會報錯,並停止執行。

#!/bin/bash
set -u

rm -fr $a/*
echo hello


運行結果如下:

$ bash test.sh
test.sh: line 4: a: unbound variable

方案三:safe-rm 替換 rm

safe-rm 是一個開源軟件工具,這名字聽起來就很安全嘛,所以它是用來替代不太安全的 rm

它可以在 /etc/safe-rm.conf 中配置路徑黑名單,定義哪些不能被 safe-rm 刪除。

我們可以將 safe-rm 更名爲 rm,假設定義了 /etc/ 無能被刪除,那麼刪除 /etc時就會報錯:

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

方案四:建立回收站機制

Windows 是有回收站的,即使誤刪了,也可以在回收站恢復。

所以,我們也可以在 Linux 實現回收站的機制。

實現思路:

刪除文件時,它並不真正執行刪除操作,而是將文件移動到一個特定目錄,可以設置定時清除回收站,或者在回收站裏面的文件大小達到一定容量時(或者用時間做判斷)執行刪除操作以騰出空間。

可以寫個 Shell 腳本替換 rm 命令,或者在需要刪除文件的時候使用 mv 命令將文件移動到回收站。  

① 創建回收站目錄

mkdir /home/.trash

② 編寫 remove.sh 腳本,內容如下 

TRASH_DIR="/home/.trash"

for i in $*;do
    STAMP=`date +%s`
    fileName=`basename $i`
    
    # 將對應的文件 mv 至 .trash 目錄
    mv $i ${TRASH_DIR}/${fileName}.${STAMP}
done

③ 修改 ~/.bashrc, 用我們自建的 remove.sh 替代 rm 命令

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

④ 設置 crontab,定期清空垃圾箱,如每天 0 點清空垃圾箱:

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

⑤ 最後,執行以下命令,使之生效

source ~/.bashrc 

方案五:根文件掛載成只讀

[~]$ cat /etc/fatab
# /etc/fstab:static file system infomation.
#<file system>    <mount pt>    <type>    <option>            <dump>    <pass>

/dev/root            /            ext4    remount,ro,noatime    0        1
...

 其中 remount,ro,就表示只讀的方式掛載。

只讀的方式掛載後,進行刪除操作是無法成功的

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章