rm -rf /* 好凶,预防它的几种办法

如果不小心删库了,跑路是不可能的。

首先:感觉不对,立马掐断运行中的脚本,然后

保留案发现场:不要重启服务器,不要断开ssh连接会话。

查看被删除了哪些文件:ls、cd + Tab 等 然后逐个装回去。。。。用上传下载、weget、别台拷贝系统文件过来等。。。。

预防误执行rm -rf /*

方案一:rm -rf 删除目录时要判断目录

#!/bin/bash

work_path=`pwd`

#如果目录不为空,才执行删除操作
if [ ${work_path} != "" ];then
    rm -fr ${work_path}/*
fi

方案二:Shell 脚本指定 set -u

#!/bin/bash

echo $a
echo hello

可以发现,echo $a 输出了一个空行,Bash 忽略了不存在的 $a,然后继续执行echo hello

最好是遇到变量不存在,脚本应该报错,而不是一声不响地往下执行。

set -u 就用来改变这种行为,在脚本加上它,遇到不存在的变量就会报错,并停止执行。

#!/bin/bash
set -u

rm -fr $a/*
echo hello


运行结果如下:

$ bash test.sh
test.sh: line 4: a: unbound variable

方案三:safe-rm 替换 rm

safe-rm 是一个开源软件工具,这名字听起来就很安全嘛,所以它是用来替代不太安全的 rm

它可以在 /etc/safe-rm.conf 中配置路径黑名单,定义哪些不能被 safe-rm 删除。

我们可以将 safe-rm 更名为 rm,假设定义了 /etc/ 无能被删除,那么删除 /etc时就会报错:

$ rm -rf /etc/
safe-rm: skipping /etc/

方案四:建立回收站机制

Windows 是有回收站的,即使误删了,也可以在回收站恢复。

所以,我们也可以在 Linux 实现回收站的机制。

实现思路:

删除文件时,它并不真正执行删除操作,而是将文件移动到一个特定目录,可以设置定时清除回收站,或者在回收站里面的文件大小达到一定容量时(或者用时间做判断)执行删除操作以腾出空间。

可以写个 Shell 脚本替换 rm 命令,或者在需要删除文件的时候使用 mv 命令将文件移动到回收站。  

① 创建回收站目录

mkdir /home/.trash

② 编写 remove.sh 脚本,内容如下 

TRASH_DIR="/home/.trash"

for i in $*;do
    STAMP=`date +%s`
    fileName=`basename $i`
    
    # 将对应的文件 mv 至 .trash 目录
    mv $i ${TRASH_DIR}/${fileName}.${STAMP}
done

③ 修改 ~/.bashrc, 用我们自建的 remove.sh 替代 rm 命令

alias rm="sh /home/remove.sh"

④ 设置 crontab,定期清空垃圾箱,如每天 0 点清空垃圾箱:

0 0 * * * rm -rf /home/.trash/*

⑤ 最后,执行以下命令,使之生效

source ~/.bashrc 

方案五:根文件挂载成只读

[~]$ cat /etc/fatab
# /etc/fstab:static file system infomation.
#<file system>    <mount pt>    <type>    <option>            <dump>    <pass>

/dev/root            /            ext4    remount,ro,noatime    0        1
...

 其中 remount,ro,就表示只读的方式挂载。

只读的方式挂载后,进行删除操作是无法成功的

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章