有戲,看到了成功的曙光。
但是新的問題就來了,我下載過來的命令文件,是沒有執行權限的。
而 chmod 命令是在 /bin 目錄的,它同樣也被刪除了,無法使用它來給予文件權限。
還在,在網上搜到了一個偉大命令 perl,可以通過它來給予文件權限:
perl -e "chmod 777, 'ls'"
真是個神奇的命令。
好了,這下賦值權限問題也解決了,成功在望了。
wget 是無法直接把 /bin 目錄下載下來的,只能下載一個文件。
但是小林我不可能一個一個去下載來進行恢復,這得要何年何月才能完成。。。
小林就想到了一個方法:
先通過 wget 的方式下載 tar 命令,并通過 perl 給予 tar 命令權限;
接著把另一臺服務器把 /bin 目錄打包成壓縮文件,然后通過 wget 下載 bin 目錄的壓縮包文件;
最后通過 tar 命令把 bin 壓縮包解壓出來。
/bin 就這樣恢復回來啦,剩余的其他目錄 也是通過同樣的操作恢復了回來。
小林的笑容漸漸恢復了回來,哈哈哈哈哈哈哈哈哈哈哈哈~
遇到 rm -fr 刪庫事件發生,一定要沉住氣,穩住心態!
本次刪庫事件,之所以小林能幸運的恢復回來,有非常關鍵兩點:
小林發現腳本執行不正常,果斷立馬的掐斷它,沒有造成重要的數據庫信息被刪除,如果掐斷的時候再晚一點,可能就真沒了;
小林發現常用命令無法使用的時候,沒有重啟服務器,不然服務器就起不來了,也沒有關閉 ssh 會話,不然無法在重新連接 ssh 會話了,也就無法進行操作了。
如果以上兩點都沒做好,服務器恢復的難度就加大了很多,更嚴重的是假期就沒法過了。
預防誤執行 rm -fr
既然 rm -fr 是殘忍的兇器,那么預防它是很有必要的,接下來跟大家討論討論預防它的幾種方案。
1、rm -rf 刪除目錄時要判斷目錄
#!/bin/bash
work_path=`pwd`
#如果目錄不為空,才執行刪除操作
if [ ${work_path} != "" ];then
rm -fr ${work_path}
fi
在執行刪除目錄操作前,先判斷要刪除的目錄是否為空,不為空才執行刪除操作。
2、Shell 腳本指定 set -u
執行腳本的時候,如果遇到不存在的變量,Bash 默認忽略它。
#!/bin/bash
echo $a
echo hello
上面代碼中,$a 是一個不存在的變量,執行結果如下。
$ bash test.sh
hello
可以發現,echo $a 輸出了一個空行,Bash 忽略了不存在的 $a,然后繼續執行 echo hello。
最好是遇到變量不存在,腳本應該報錯,而不是一聲不響地往下執行。
set -u 就用來改變這種行為,在腳本加上它,遇到不存在的變量就會報錯,并停止執行。