linux创建自定义回收站

Posted xiewenda8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux创建自定义回收站相关的知识,希望对你有一定的参考价值。

自定义回收站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



参考文章:http://johnsteven.blog.51cto.com/2523007/924671

以上是关于linux创建自定义回收站的主要内容,如果未能解决你的问题,请参考以下文章

创建自定义线程池, 并在执行完将线程回收的两种方式

跨应用域回收使用自定义性能计数器

linux明日命令:rm命令

打造Linux回收站

linux 如何自定义命令函数?

自定义回收商查看通函列表安排