CSDN写了Bug,误执行 rm-fr/×,我删删删删库了,要跑路吗?( 二 )


通过一番的确认和对比后 , 发现主要被删除的有四个目录分别是:
/bin 、/boot 、/dev 这三个目录整个都被删除了
/lib 目录里的动态库部分被删除
来复习下上面这四个目录主要是存放了什么:
/bin 存放常用系统命令 , ls、cp、rm、chmod 等常用命令都在此目录;
/boot 系统启动目录 , 保存与系统启动相关的文件 , 如内核文件和启动引导程序;
/dev 设备文件保存位置;
/lib 存放程序所需的动态库和静态库文件;
/boot 都被删除了 , 还好小林没有重启服务器 , 要是重启了服务器 , 就完犊子了 , 系统肯定起不来了 。
cd 命令是在 /sin 目录下 , /sin 还健全 , 所以 cd 是可以正常使用 。
所幸重要的数据库信息和文件都还没删除 , 所以小林首要的目标是要恢复 /bin、/boot、/dev、/lib 这四个目录 。
还原文件
由于 /bin 目录 和 /lib 部分动态文件被删除 , 常用的传递文件的方式是无法使用的 , 如 ftp、scp、mount 等 。
小林摸索了很久 , 竟然发现 wget 可以使用 , wget 命令是在 /usr/bin 目录 , 所幸 /usr/bin 还健全 。
于是 , 用了取巧的方法 , 先另一台正常的服务器 , 把 /bin 目录放到了 Web 服务器的 Web 目录 , 接着通过 wget 进行下载 。
有戏 , 看到了成功的曙光 。
但是新的问题就来了 , 我下载过来的命令文件 , 是没有执行权限的 。
而 chmod 命令是在 /bin 目录的 , 它同样也被删除了 , 无法使用它来给予文件权限 。
还在 , 在网上搜到了一个伟大命令 perl , 可以通过它来给予文件权限:
perl-e"chmod 777, 'ls'"
真是个神奇的命令 。
好了 , 这下赋值权限问题也解决了 , 成功在望了 。
wget 是无法直接把 /bin 目录下载下来的 , 只能下载一个文件 。
但是小林我不可能一个一个去下载来进行恢复 , 这得要何年何月才能完成 。
小林就想到了一个方法:
先通过 wget 的方式下载 tar 命令 , 并通过 perl 给予 tar 命令权限
接着把另一台服务器把 /bin 目录打包成压缩文件 , 然后通过 wget 下载 bin 目录的压缩包文件
最后通过 tar 命令把 bin 压缩包解压出来
/bin 就这样恢复回来啦 , 剩余的其他目录 也是通过同样的操作恢复了回来 。
小林的笑容渐渐恢复了回来 , 哈哈哈哈哈哈哈哈哈哈哈哈
遇到 rm -fr /* 删库事件发生 , 一定要沉住气 , 稳住心态 。
本次删库事件 , 之所以小林能幸运的恢复回来 , 有非常关键两点:
小林发现脚本执行不正常 , 果断立马的掐断它 , 没有造成重要的数据库信息被删除 , 如果掐断的时候再晚一点 , 可能就真没了 。
小林发现常用命令无法使用的时候 , 没有重启服务器 , 不然服务器就起不来了 , 也没有关闭 ssh 会话 , 不然无法在重新连接 ssh 会话了 , 也就无法进行操作了 。
如果以上两点都没做好 , 服务器恢复的难度就加大了很多 , 更严重的是五一节就没的过了 。
预防误执行 rm -fr /*
既然 rm -fr /* 是残忍的凶器 , 那么预防它是很有必要的 , 接下来跟大家讨论讨论预防它的几种方案 。
方案一:rm -rf 删除目录时要判断目录
#!/bin/bash
work_path=`pwd`
#如果目录不为空 , 才执行删除操作
if[$!=""];then
rm -fr$/*
fi
在执行删除目录操作前 , 先判断要删除的目录是否为空 , 不为空才执行删除操作 。
方案二:Shell 脚本指定 set -u
执行脚本的时候 , 如果遇到不存在的变量 , Bash 默认忽略它 。
#!/bin/bash
echo$a
echohello
上面代码中 , $a 是一个不存在的变量 , 执行结果如下 。


推荐阅读