1. 程式人生 > >Linux自定義防誤刪指令碼

Linux自定義防誤刪指令碼

一、背景

俗話說的真好,常在河邊走,怎能不溼鞋子,之前作為工程師自覺的很細心的我,今天終於有了誤操作,想刪除伺服器上臨時的系統掃描檔案如下圖:
Linux自定義防誤刪指令碼
由於是在root的家目錄,本想這/tmp/下有很多系統掃描檔案,系統性的tab了一下,由於是自己的監控測試伺服器也沒多想,tab了一下應該是有多個檔案,之後直接跟*然後刪除全部掃描檔案,但發現回車的一瞬間,發現只有一個掃描檔案,瞬間頭皮發麻,雖然只是自己的測試伺服器,但下面也有很多指令碼和資料檔案,心裡又氣又恨。查看了下測試伺服器只有一個根也沒其他磁碟,此時ext3grep/extundelete這類工具就沒辦法了,想想也是有其他辦法,但比較麻煩,算了就當買個教訓吧,裡面寫個自定義rm命令指令碼,來避免此類事情的發生。

二、思路

由於是過度自信,操作執行rm -rf手速感人,也沒多看,因此自定義rm命令即可

  • 通過alias rm來移動檔案到一個回收站目錄
  • 定期的在系統磁碟允許可控的使用率情況下來對檔案進行刪除
    因此寫了一下指令碼來實現,與其說放勿刪,不如說是延遲刪除更為確切
#!/bin/bash
# auth:kaliarch
# function:自定義rm命令,每天晚上定時清理

# 定義rm刪除命令替換指令碼
CMD_SCRIPTS=$HOME/.rm_scripts.sh
# 定義回收站目錄
TRASH_DIR=$HOME/.TRASH_DIR
CRON_FILE=/var/spool/cron/root
BASHRC=$HOME/.bashrc

[ ! -d ${TRASH_DIR} ] && mkdir -p ${TRASH_DIR}

cat > $CMD_SCRIPTS <<EOF
PARA_CNT=\$#
TRASH_DIR=$TRASH_DIR

for i in \$*; do
     DATE=\$(date +%F%T)
     fileName=\$(basename \$i)
     mv \$i \$TRASH_DIR/\$fileName.\$DATE
done
EOF

sed -i "
[email protected]
$(grep 'alias rm=' $BASHRC)@alias rm='bash ${CMD_SCRIPTS}'@g" $BASHRC source $HOME/.bashrc echo "0 0 * * * rm -rf $TRASH_DIR/*" >> $CRON_FILE echo "刪除目錄:$TRASH_DIR" echo "刪除指令碼:$CMD_SCRIPTS" echo "請執行:source $BASHRC 來載入檔案或退出當前shell重新登入"

三、測試

  • 執行指令碼替換rm命令
    Linux自定義防誤刪指令碼
    之後推出重新登入,或按提示source檔案載入生效
  • 指令碼生成檔案
    Linux自定義防誤刪指令碼
    Linux自定義防誤刪指令碼
    可以看到在指令碼執行使用者的家目錄,會生成回收站目錄和檔案刪除指令碼,會建立定時任務定時清理回收站,可以根據後期磁碟情況,自定義週期清理,
  • 測試檔案刪除
    Linux自定義防誤刪指令碼
    對檔案或目錄進行rm命令操作,可以發現是已經成功移動到回收站,定時任務會定時清理該目錄下的東西,延遲我們日常rm -rf誤操作命令

    四、擴充套件

  • 作為工程師,日常操作一定還是要小心
  • 使用雲伺服器,做好定時快照策略
  • 如果為傳統伺服器做好檔案異地備份
  • 安裝使用資料恢復軟體工具ext3grep、extundelete等第一時間恢復誤操作資料。