如果不小心删库了,跑路是不可能的。
首先:感觉不对,立马掐断运行中的脚本,然后
保留案发现场:不要重启服务器,不要断开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
,就表示只读的方式挂载。
只读的方式挂载后,进行删除操作是无法成功的