一, 背景
俗话说的真好, 常在河边走, 怎能不湿鞋, 之前作为工程师自觉的很细心的我, 今天终于有了误操作, 想删除服务器上临时的系统扫描文件如下图:
由于是在 root 的家目录, 本想这 / tmp / 下有很多系统扫描文件, 系统性的 tab 了一下, 由于是自己的监控测试服务器也没多想, tab 了一下应该是有多个文件, 之后直接跟 * 然后删除全部扫描文件, 但发现回车的一瞬间, 发现 / tmp 只有一个扫描文件, 瞬间头皮发麻, 虽然只是自己的测试服务器, 但下面也有很多脚本和数据文件, 心里又气又恨. 查看了下测试服务器只有一个根也没其他磁盘, 此时 ext3grep/extundelete 这类工具就没办法了, 想想也是有其他办法, 但比较麻烦, 算了就当买个教训吧, 里面写个自定义 rm 命令脚本, 来避免此类事情的发生.
二, 思路
由于是过度自信, 操作执行 rm -rf 手速感人, 也没多看, 因此自定义 rm 命令即可
通过 alias rm 来移动文件到一个回收站目录
定期的在系统磁盘允许可控的使用率情况下来对文件进行删除
因此写了一下脚本来实现, 与其说放勿删, 不如说是延迟删除更为确切
Git 地址
- #!/bin/bash
- # auth:kaliarch
- # function: 自定义 rm 命令, 每天晚上定时清理
- # 定义 rm 删除命令替换脚本
- CMD_SCRIPTS=$HOME/.rm_scripts.sh
- # 定义回收站目录
- TRASH_DIR=$HOME/.TRASH_DIR
- CRON_FILE=/var/spool/cron/root
- BASHRC=$HOME/.bashrc
- [ ! -d ${
- TRASH_DIR
- } ] && mkdir -p ${
- TRASH_DIR
- }
- cat> $CMD_SCRIPTS <<EOF
- PARA_CNT=\$#
- TRASH_DIR=$TRASH_DIR
- for i in \$*; do
- DATE=\$(date +%F%T)
- fileName=\$(basename \$i)
- mv \$i \$TRASH_DIR/\$fileName.\$DATE
- done
- EOF
- sed -i "s@$(grep'alias rm='$BASHRC)@alias rm='bash ${CMD_SCRIPTS}'@g" $BASHRC
- source $HOME/.bashrc
- echo "0 0 * * * rm -rf $TRASH_DIR/*">> $CRON_FILE
- echo "删除目录:$TRASH_DIR"
- echo "删除脚本:$CMD_SCRIPTS"
- echo "请执行: source $BASHRC 来加载文件或退出当前 shell 重新登录"
三, 测试
运行脚本替换 rm 命令
之后推出重新登录, 或按提示 source 文件加载生效
脚本生成文件
可以看到在脚本运行用户的家目录, 会生成回收站目录和文件删除脚本, 会创建定时任务定时清理回收站, 可以根据后期磁盘情况, 自定义周期清理,
测试文件删除
对文件或目录进行 rm 命令操作, 可以发现是已经成功移动到回收站, 定时任务会定时清理该目录下的东西, 延迟我们日常 rm -rf 误操作命令
四, 扩展
作为工程师, 日常操作一定还是要小心
使用云服务器, 做好定时快照策略
如果为传统服务器做好文件异地备份
安装使用数据恢复软件工具 ext3grep,extundelete 等第一时间恢复误操作数据.
来源: http://blog.51cto.com/kaliarch/2300148