Linux下的文件安全删除
目录
危险
rm -rf /
这是一条运维、程序员都非常忌惮的指令。当我们登录root用户或者拥有root权限的时候,一股毁灭世界的力量也被赋予。我曾亲眼见证过身边的同事在我们的开发环境中敲下这一行指令,随着而来的就是开发环境的宕机,数据丢失,一下午的开发停滞。
为了减少悲剧再次上演的几率,我们有必要对 rm
指令进行调整。
网络上流传着的解法皆大同小异,基本思路都是使用回收站命令替代 rm
,再用计划任务定时清理回收站,但是我并不喜欢这样的操作,因为我很明确地想要删除这批文件,我想让它们即刻消失,不再占据我的磁盘空间。
所以我的需求逐渐明了:规避掉高危删除操作的同时,支持文件立即删除。
好在互联网上志同道合的同学不胜枚举,原来早有大神有这样的需求和想法,并且得以实现,并把成果发表在了博客中,感谢大神。
我在此将其用法整理如下。
脚本源码
#!/bin/bash
# rm指令参数
RMARGS="${@}"
# rm指令绝对路径
RMPATH="/bin/rm"
# 列出根目录下的文件,并将它们拼接,用空格隔开
sys1dir=$(ls / | sed 's/^/\//'|paste -s -d " ")
# 如果删除参数为空并且rm指令不存在,则直接退出
[ "${RMARGS}" == "" ] && ${RMPATH} && exit
# 输出错误提示并退出
SBRUN() {
echo -ne "\033[41;37mWhy run this command\033[0m\n"
exit 255
}
# 判断是否是在删除根目录
if grep "$sys1dir" <<< $RMARGS >/dev/null 2>&1; then
SBRUN;
fi
# 检查删除目录里面是否包含根目录
for i in ${@}; do [ "$i" = "/" ] && SBRUN; done
if [ "${RMARGS}" == '-h' ] || [ "${RMARGS}" == '--help' ]; then
# 显示帮助文档
${RMPATH} ${RMARGS}
else
# 要求输入yes才真正执行删除
while [ "${confirm}" != "yes" ] && [ "${confirm}" != "no" ]; do
echo -ne "You are going to execute \"${RMPATH} \033[41;37m${RMARGS}\033[0m\",please confirm (yes or no):"
read confirm
done
# 执行删除
[ "${confirm}" == "yes" ] && ${RMPATH} ${RMARGS} || exit
fi
用法
拷贝上述脚本内容,在服务器上 vim /usr/bin/securityremove
新建文件粘贴,并保存,接着依次执行如下命令
# 赋予执行权限
chmod +x /usr/bin/securityremove
# 命令替代
echo 'alias rm="/usr/bin/securityremove"' >> /etc/bashrc
. /etc/bashrc
随后使用 rm 指令删除操作就会有确认和检查了~
已知问题
如果文件名中带有空格时会删除失败,这时候需要用 \rm
指令来进行删除。