如果不小心刪庫了,跑路是不可能的。
首先:感覺不對,立馬掐斷運行中的腳本,然後
保留案發現場:不要重啓服務器,不要斷開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
,就表示只讀的方式掛載。
只讀的方式掛載後,進行刪除操作是無法成功的