一、rm-rf不安全,仅仅是由于不小心么?
1.1 rm-rf风险
rm -rf / home/work/logs/
乍看之下是在删除home下work下的logs中的日志,但是这条命令有问题么?
对比一下
rm -rf /home/work/logs/
删掉整个/下面的所有目录
[root@master /]# ll
total 94
dr-xr-xr-x. 2 root root 4096 Sep 3 2019 bin
dr-xr-xr-x. 5 root root 1024 Sep 3 2019 boot
drwxr-xr-x. 20 root root 3760 May 21 07:31 dev
drwxr-xr-x. 4 root root 4096 Sep 9 2019 dfs
drwxr-xr-x. 94 root root 4096 May 21 07:29 etc
drwxr-xr-x. 2 root root 4096 Sep 23 2011 home
dr-xr-xr-x. 9 root root 4096 Sep 3 2019 lib
dr-xr-xr-x. 10 root root 12288 Sep 3 2019 lib64
drwx------. 2 root root 16384 Sep 3 2019 lost+found
drwxr-xr-x. 2 root root 4096 Sep 23 2011 media
drwxr-xr-x. 2 root root 4096 Sep 23 2011 mnt
drwxr-xr-x. 6 root root 4096 Sep 9 2019 opt
dr-xr-xr-x. 208 root root 0 May 21 07:28 proc
dr-xr-x---. 3 root root 4096 Sep 9 2019 root
dr-xr-xr-x. 2 root root 12288 Sep 3 2019 sbin
drwxr-xr-x. 7 root root 0 May 21 07:28 selinux
drwxr-xr-x. 2 root root 4096 Sep 23 2011 srv
drwxr-xr-x 13 root root 0 May 21 07:28 sys
drwxrwxrwt. 10 root root 4096 May 21 07:30 tmp
drwxr-xr-x. 13 root root 4096 Sep 3 2019 usr
drwxr-xr-x. 18 root root 4096 Sep 3 2019 va
1.2 虚拟机测试
本次测试采用虚拟机测试
rm: cannot remove `sys/block/dm-0': Operation not permitted
rm: cannot remove `sys/block/dm-1': Operation not permitted
[root@master /]# cd /
[root@master /]# ll
-bash: /bin/ls: No such file or directory
由于测试之前使用了快照,所以可以恢复.否则这种操作就是无法回退的问题.
二、生产环境如何避免?
2.1 shell中的定时回收站
生产环境把rm -rf 命令 替换为mv,再增加定时shell定期清理.
cd /yuanian/test
mv * /yuanian/trash
2.2 权限收拢
线上分配用户权限比如 /work账号,仅可以删除 /home/work/logs/目录,无法删除根目录.
2.3 使用 &&(仅适用于目录不存在)
通过 "&&" 合并命令
!!!! 注意 本命令仍有风险
cd ${log_path}&&rm -rf *
通过此命令如果&&之前的语句执行失败,后半句也无法执行.
2.31 访问目录不存在
[root@master /]# cd /opt/logs&&rm -rf *
-bash: cd: /opt/logs: No such file or directory
[root@master opt]# ll
total 16
drwxr-xr-x. 5 root root 4096 Sep 9 2019 cloudera
drwxr-xr-x. 4 1106 4001 4096 May 13 2016 cloudera-manager
drwxr-xr-x. 7 uucp 143 4096 Dec 16 2018 jdk1.8.0_201
drwxr-xr-x. 2 root root 4096 Sep 9 2019 soft
2.32 使用了空格访问的问题
测试
[root@master logs]# cd / opt/logs&&rm -rf *
rm: cannot remove `boot': Device or resource busy
rm: cannot remove `dev/pts/0': Operation not permitted
rm: cannot remove `dev/pts/ptmx': Operation not permitted
rm: cannot remove `dev/shm': Device or resource busy
复测原因
[root@master opt]# cd / opt/logs
[root@master /]#
识别了 / 根目录.
2.4 判断目录是否存在
规范命令:
对目录进行操作前,先判断目录是否存在.
[root@master opt]# cd logs/
[root@master logs]# pwd
/opt/logs
三、小结
生产建议采用 mv +定时策略,避免发生文件的删除异常.
3.1 实现方案
[root@master /]# mkdir /work && cd /work&&mkdir trash
[root@master work]# ll
total 4
drwxr-xr-x. 2 root root 4096 May 21 07:43 trash
3.2 定期策略
3.21 创建shell目录
[root@master work]# mkdir shell
[root@master work]# ll
total 8
drwxr-xr-x. 2 root root 4096 May 21 07:45 shell
drwxr-xr-x. 2 root root 4096 May 21 07:43 trash
[root@master work]# cd shell
[root@master work]# vim clear.sh
3.22 编辑定时脚本
进入vim 写入
#!/bin/bash
cd /yuanian/trash && rm -rf *
echo "clear trash"
授权 chmod 755 clear.sh
[root@master shell]# ll
total 4
-rw-r--r--. 1 root root 66 May 21 07:59 clear.sh
[root@master shell]# chmod 755 clear.sh
[root@master shell]# ll
total 4
3.23 验证脚本的正确性(测试如下脚本)
1. 测试目录是否正确
cd /yuanian/trash
2. 测试是否可以正确删除文件
[root@master shell]# mv test /yuanian/trash/
[root@master shell]# sh clear.sh
clear trash over
[root@master shell]# cd /yuanian/trash/
[root@master trash]# ll
total 0
3.24 加入定时策略
3.241 判断是否有corn程序
[root@master shell]# service crond status
crond (pid 2077) is running...
[root@master shell]# chkconfig --list crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
如果没有
yum -y install crontabs
3.242 设置添加的脚本
方式1 crontab -e 增加任务 ,wq保存退出
方式2 直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。
crontab -e配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务 查看调度任务 crontab -l //列出当前的所有调度任务 crontab -l -u jp //列出用户jp的所有调度任务 删除任务调度工作 crontab -r //删除所有任务调度工作
** 修改/etc/crontab这种方法只有root用户能用,这种方法更加方便与直接直接给其他用户设置计划任务,而且还可以指定执行shell等等, crontab -e这种所有用户都可以使用,普通用户也只能为自己设置计划任务。
查看 vim /etc/crontab ,默认的文件形式如下:
[root@master etc]# vim crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
注意上面要指定用户 名.
* * * * * root /work/shell/clear.sh
添加脚本 -->每隔两周23.00执行脚本
[root@master trash]# crontab -e
0 23 */14 * * /work/shell/clear.sh
[root@master trash]# crontab -l
0 23 */14 * * /work/shell/clear.sh
四、采用safe-rm替换本地rm目录
4.1.下载safe源码包:
wget https://launchpad.net/safe-rm/trunk/0.12/+download/safe-rm-0.12.tar.gz
4.2.解压safe-rm
tar -zxf safe-rm-0.12.tar.gz
3.复制safe-rm到/usr/local/bin目录下
cp safe-rm-0.12/safe-rm /usr/local/bin/rm
4.添加环境变量
vim /etc/profile
#在最后一行添加
PATH=/usr/local/bin:$PATH
保存后使其生效
source /etc/profile
5.配置路径黑名单(不允许删除的目录)
vim /etc/safe-rm.conf
#添加要删除的路径按行分隔
/
/bin
/etc
/usr
/opt
/sbin
/test
6.测试删除test文件夹
mkdir /test
rm -rf /test