众所周知,在Linux下的非root用户有很多权限问题。但是做为程序员而非管理员的我们,只需开发自己的程序就行了。因此直接使用root用户可以避免很多问题的发生。但是如果误使用
rm
怎么办?
最好的方式就是为删除命令建立 回收站,当用户执行
rm
时实际上执行的是
mv
命令,将文件移动到我们的
回收站中,然后设置一个指令来自动清空
回收站,这样即使误删除导致系统无法启动我们也可以使用LiveCD挂载硬盘,从而进行文件还原。
一、主要功能
- 重新编写删除文件命令并用该命令替换默认的
rm
,以免误删除文件。 - 包含
moveToCrash
,delDelayFiles
,cleanCrash
以及moveToCrash.conf
四个文件,分别为主命令,自动清理命令,清空回收站命令以及配置文件。 - 支持管理员与非管理员用户操作。
- 对于操作用户,被删除文件的原始目录以及目标目录都有详细的日志记录,以供恢复时使用。
- 支持回收站自动清理1至7天前 (可配置) 的内容以节约空间(亦可手动清理)。
- 支持手动清空回收站操作。
- 所有功能对于用户来说都是透明的。
- 让从删库到跑路彻底成为历史。
二、脚本中需要修改的内容
配置文件moveToCrash.conf中回收站和日志文件路径
CARSHROOTDIR="/raid/.crash" #自定义回收站根目录
CRASHDISK="/dev/sdb1" #回收站所在的磁盘
RETAINDAYS="3" #回收站自动清理时保留的天数 [1,7]
EXTERNDIRLIST="samba" #自动清理脚本中${CARSHROOTDIR}目录下禁止删除的文件夹
USEPROGRESS="0" #是否显示进度条(需要为mv命令打补丁),修改此项时必须将NOTFIRSTUSE文件删除
LOGFILE="${CARSHROOTDIR}/log/moveToCrash.log"
NOTFIRSTUSE="${CARSHROOTDIR}/.__nofirst__"
三、设置清理过时文件夹的定时任务
本小节设置定时任务,以便让系统自动执行
delDelayFiles
任务
执行crontab -e
后输入
0 17 * * * /usr/bin/delDelayFiles
代表每天下午五点整执行命令
四、配置系统
打开~/.bashrc
文件,查找alias rm=
字样并改成如下所示(如果找不到直接新建一行)
#alias rm='rm -i'
alias rm='moveToCrash'
意思是输入rm
命令时实际上执行的是moveToCrash
。
然后执行
source ~/.bashrc
使命令立即生效。
五、脚本
moveToCrash
,delDelayFiles
以及cleanCrash
脚本放于/usr/bin
目录下moveToCrash.conf
配置文件放于/etc
目录下- 请使用
chmod +x filename
命令赋予第一条的三个命令可执行权限
moveToCrash,命令主脚本,代替
rm
命令
#!/usr/bin/env bash
#脚本功能:重新写rm命令,以免误删除
#删除程序运行锁
function delRunningLocked()
{
${REALRMPATH} -rf ${LOCKFILE}
}
function exitScript()
{
LE $1
Log "**************删除命令处理完成***************"
delRunningLocked
exit -1
}
function checkDelFilesHandler()
{
result="$(crontab -l | grep delDelayFiles | grep -v '#')"
if [ "x${result}" == "x" ];then
echo "NO"
else
echo "OK"
fi
}
function handlerLogFile()
{
file="${LOGFILE}"
logdir="$(dirname ${
file})"
if [ ! -d "${logdir}" ];then
mkdir -p ${logdir}
fi
if [ ! -d "${CARSHROOTDIR}" ];then
mkdir -p ${CARSHROOTDIR}
fi
if [ -e "${file}" ];then
size="$(ls -l $file | awk '{print $5}')"
if [ "${size}" -gt "5000000" ];then
filename="$(basename ${
file})"
dirname="$(dirname ${
file})"
newname="$(echo ${
filename} | awk -F '[.]' '{print $1"-old."$2}')"
mv "${file}" "${dirname}/${newname}"
fi
fi
}
function checkOutConf()
{
if [ ! -e "${1}" ];then
echo "无法找到配置文件: ${1}!"
exit -1
fi
. ${1}
[ ! -e "${CARSHROOTDIR}" ] && mkdir -p ${CARSHROOTDIR}
if [ ! -e "${NOTFIRSTUSE}" ];then #非第一次运行时检查
if [ "${USEPROGRESS}" = "1" ];then #核查是否需要使用进度条
if [ "$(checkProgr