一、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