自定義回收站shell腳本 和 替代rm命令
今天同事在linux上部署項目 看到服務器下的war想刪除 項目正在啟動著 rm命令執行war包刪除了 war包解壓的項目也沒了,沒有備份,數據丟失了,折騰了半天協調了半天也沒能找回數據,還好數據不是很重要,項目使用的人並不多。自己也思考了問題出現的必然性,總結下避免此情況要基本應該做的三點。
1.首先對於一個線上項目要定期做好的完整的數據備份工作,數據庫,項目文件等。
2.對於非專業實施人員登陸服務器的權限控制工作。
3.當然作為一個開發者的素質習慣,在操作數據之前先不要干別的,首先備份要操作的數據。
通過這次事故,自己幫忙找數據,確實很麻煩,所以要做好避免這種事故的發生,做一些可以挽回的操作,搜索資料自定義一個回收站,把rm命令覆蓋,作為假刪除先放到另一個文件夾保存一段時間在定時刪除,腳本如下。
實驗系統ubuntu 15.0.4.
1.仿照別人的編寫rm.py 替換rm命令的腳本如下:
#!/usr/bin/env python
# Linux Recycle
# Author Steven
# Modify 2013-12-18
import time,sys,os,shutil
recy_path = "/data/Recycle/"
now = time.strftime('%Y%m%d_%H_%M_%S',time.localtime(time.time()))
if not os.path.isdir(recy_path):
os.makedirs(recy_path)
para = sys.argv[1:]
if '-f' in para:
para.remove('-f')
if '-r' in para:
para.remove('-r')
if '-rf' in para:
para.remove('-rf')
deny = ['/usr','/usr/','/var','/var/','/root','/root/','/etc','/etc/','/home','/home/','/proc','/proc/','/boot','/boot/','/bin','/bin/','/sbin','/sbin/','/lib','/lib/','/
lib64','/lib64/','/']
for p in tuple(para):
if p in deny:
para.remove(p)
print "Dangerous command: %s" % p
if not para:
sys.exit('Nothing to run.')
for f in para:
try:
if '/' not in f:
recy_file = "%s/%s_%s" % (recy_path,now,f)
shutil.move(f,recy_file)
else:
path = os.path.dirname(f)
file = os.path.basename(f)
if file == "":
file = path.split('/')[-1]
recy_file = "%s/%s_%s" % (recy_path,now,file)
shutil.move(f,recy_file)
except Exception,e:
print e
提示:deny 為添加的不能執行rm操作的文件夾和路徑可以自己添加
2.授權命令
chmod 755 /bin/rm.py
chmod 777 /data/Recycle 支持一般用戶rm
echo "alias rm='/bin/rm.py'" >> /etc/bashrc
source /etc/bashrc 回收站生效
後續:今天重啟了系統發現,命令失效了,原因是utuntu下的bashcr文件是在/root/ 下邊
系統啟動的時候會默認加載/root/下邊的 bashrc文件 於是重新執行echo "alias rm='/bin/rm.py'" >> /root/bashrc
就行了,不同操作系統還要看自己配置文件的位置而定。
3、刪除文件測試
rm /root/text.txt
此時,text.txt文件就會被mv 到 回收站目錄 /data/Recycle
遠程腳本調用時,須用全路徑:/bin/rm.py
4、刪除回收站文件
/bin/rm -rf /data/Recycle/text.txt
5、回收站機制是為了解決不小心誤刪問題,如果確定某個文件永久刪除則直接刪除
/bin/rm -rf filename
6、為防止回收站目錄遺留文件過多而占用太多的硬盤資源,使用crontab定時刪除歷史文件
a、編寫定時刪除回收站文件程序腳本
#!/bin/sh
# Author Steven
if [ `whoami` != 'root' ];then
echo "Must be root run this scripts!!" >> /var/log/messages
exit
fi
dirpath=/data/Recycle/
#這裡定義刪除一天之前的,也就是回收站每天清空一次,可以根據需要更改
ago=`date -d "-1 day" +%Y%m%d`
if [ ! -d $dirpath ];then
echo "This path [${dirpath}] not exist, please check." >> /var/log/messages
exit
fi
for i in `ls $dirpath`
do
# Get datestamp and check it. For example: 20130304_09_54_25_ld.lock
datestamp=`echo $i | awk -F'_' '{print $1}'`
check=`echo "$datestamp" | grep "^[0-9]\{8\}$"`
if [ "check" != '' ];then
# Remove old files.
if [ "$datestamp" -lt "$ago" ];then
/bin/rm -rf $dirpath/$i
fi
fi
done
b、添加計劃任務
crontab -e
1 5 * * 0 sh /root/clean_recycle.sh
c、給文件加鎖,避免被修改。
chattr +i /bin/rm.py
chattr +i /root/clean_recycle.sh
參考文章:/content/3337991.html