Linux下设置回收站Trash
在linux中,为了防⽌误删设置回收站Trash来临时存放删除的⽂件!为了实现这个⼩功能,笔者将总结概括⾃⼰的知识,涉及到进程⽬录、脚本、临时⽂件tmpfiles、trash-cli⼯具等等。
⼀、恢复误删⽂件后进程存在的⽂件
在⼀个终端⾥⾯新建⽂件,使⽤cat对中国⽂件做追加操作(ctrl+d确认输⼊的内容,这⾥不需要输⼊,只保持输⼊状态即可),即保持有个进程在操作这个⽂件。
在开⼀个终端,rm -删除这个⽂件。这⾥需要使⽤lsof⼯具,列出打开⽂件(lists openfiles)。
lsof | grep deletefile查这个⽂件或者 lsof | grep deleted查所有的deleted⽂件。
进⼊ 进程⽬录,⼀般是进⼊/proc/pid/fd/ ,将⽂件名为1的⽂件,软连接到/home/ (deleted) ,复制到需要的⽬录中。
误删除的⽂件进程已经不存在,借助于⼯具才能恢复,可以使⽤第三⽅⼯具extundelete,笔者在此就不演⽰了,毕竟重点在于设置回收站Trash来防⽌误删。
⼆、简单的脚本实现每个⽤户的回收站Tra sh
原理很简单,重新将rm的别名,最简单的就是在环境变量⾥⾯设置rm的别名为: mv $@ ~/.trash/  。
但是今天我们搞复杂点,设置为⾃定义函数trash。然后将下⾯的脚本置于/etc/profile.d下,通过. /etc/. profile来使其⽣效。关于系统环境变量以及⽤户环境变量的问题,以往的⽂章讲过好⼏次了,如有不栋请搜索以往的⽂章。置于系统环境变量下,是因为每个⽤户都需要⽣效,保存各⾃的回收站Trash。
$@ 都表⽰传递给函数或脚本的所有参数,在此指所有⽂件。
mkdir -p ~/.trash
alias rm=trash
alias rl='ls ~/.trash'
alias ur=undelfile
undelfile()
{
mypath=`pwd`
cd ~/.trash
mv -i $@ $mypath
cd $mypath
}
trash()
{
mv $@ ~/.trash/
}
cleartrash()
环境变量path误删有影响吗{
read -p "clear sure?[n]" confirm
[ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /bin/rm -rf ~/.trash/* }
我们来测试⼀下。脚本中三个函数的功能以及别名都正常。删除于恢复多⽂件也正常,笔者就不测试了。
笔者觉得最后⼜将这个脚本优化了⼀下,将rm改为了srm,alias srm=trash,意为safe rm 。⽬的是为了系统脚本中的rm区分开,因为其他的脚本后台执⾏的rm删除不需要⼈为保存,还有脚本中rm带参数的话,可能会使rm命令失效。那么在以后命令⾏的运维过程中就可以推荐使⽤srm,⽽⾮直接暴⼒的使⽤rm!
Bash 别名仅在交互式 shell 中使⽤,因此使⽤此别名不应⼲扰期望使⽤ rm 的脚本,也可以rm前⾯加上⼀个反斜杠来绕过别名,\rm  。同时可以将 rm 别名为会提醒您不要使⽤它的东西,alias rm='echo "This is not the command you are looking for."; false'  。命令⾏就可以直接屏蔽rm命令,脚本中或者真正需要时使⽤/rm ,\rm  file-without-hope  。
三、定时清理回收站Tr a sh
利⽤crontab脚本来定时清理每个⽤户的回收站Trash中的过期⽂件,防⽌回收站⽂件过多。可以使⽤脚本中的
以前笔者做过crontab脚本来删除过期的⽤户操作⽇志和mysql数据库操作⽇志,脚本类似,置于/etc/cron.daily下:
delete_time=15
trash⽬录  -mtime +$delete_time  -exec rm -r {} \;
find trash⽬录
需要注意的是,每个⽤户都有⼀个回收站Trash,那么需要每个⽤户都设置crontab定时任务来完成清理⼯作吗?是不是过于⿇烦了,特别是⽤户多的情况下。
四、Linux临时⽂件tm pfiles来完成清理
笔者写过⼀篇⽂章-Linux管理临时⽂件tmpfiles,⾥⾯根据systemd-tmpfiles-clean.timer进⾏管理systemd-tmpfiles-clean.service服务,开机15分钟执⾏服务或者隔⼀天执⾏⼀次清理。服务⼜是调⽤程序/usr/bin/systemd-tmpfiles --clean 来清理被标记的⽂件⽬录。
那么那些⽂件会被标记清理呢?通过man systemd-tmpfiles查看:systemd-tmpfiles creates, deletes, and cleans up volatile and temporary files and directories, based on the  configuration file format and location specified in tmpfiles.d(5).
到 tmpfiles.d⽬录下的f,清理/tmp⽬录超过10天的内容以及清理/var/tmp⽬录超过30天的内容,同时带x标记的是忽略指定的路径及该路径下的所有内容。
那么我们就可以将每个⽤户的回收站Trash置于/tmp⽬录下,让systemd帮我们管理。
现在笔者来改写⼀下这个脚本。关于⽂件权限问题,测试了好久,坑!
trash_path=/tmp/trash/`whoami`
if [ ! -d /tmp/trash ]
then
mkdir -p  /tmp/trash
chmod 777 /tmp/trash
fi
if [ ! -d ${trash_path} ]
then
mkdir ${trash_path}
chmod 700 ${trash_path}
fi
alias srm=trash
alias rl="ls $trash_path"
alias ur=undelfile
undelfile()
{
mypath=`pwd`
cd $trash_path
mv -i $@ $mypath
cd $mypath
}
trash()
{
mv $@ $trash_path
}
cleartrash()
{
read -p "clear sure?[n]" confirm
[ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /bin/rm -rf $trash_path/*
}
最后在/tmp/trash⽬录下⽣成了⽤户⽂件夹!
既然回收站都放在⼀个⽂件夹了,那么其实就可以使⽤⽤户操作⽇志或者数据库操作⽇志
的清理⽅法了,详情参考笔者以前的⽂章。⾃⼰定义清理周期⽐systemd更加灵活。还有⼀的清理⽅法了,详情参考笔者以前的⽂章。⾃⼰定义清理周期⽐system d更加灵活。还有⼀
点,要是长期没有使⽤srm,把权限为777的tra sh⽬录给删除了,下⼀次普通⽤户登录时点,要是长期没有使⽤sr m,把权限为777的tra
是没有权限建⽴777的tra sh⽬录的!当然可以脚本上添加权限也可以搞定。
所以,最好还是和以前⽂章⼀样,在其他地⽅ ⽐如/opt⽬录建⽴trash⽬录,下⾯再建⽴各个⽤户的⽬录,根据cron来定期清理。
五、tra sh-c li⼯具
五、tr a

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。