服务器托管用户在日常维护的过程中会使用一些技术将服务器中的数据进行备份,但是很多时候不少运维人员为了能让备份数据与服务器中的数据实时同步往往在进行维护的时候不采取隔离措施。通常情况下这样的做法不会出现意外,然而下面的一个事故为IDC行业的运维工作人员敲响了警钟。
事情是这样的Marco Marsala 是一家小型主机托管公司的老板,他的业务就是给客户提供主机托管。但他最近遇到了一个天大的麻烦:由于脚本错误,他不慎删光了所有客户的数据。更糟糕的是,由于 Bash 脚本代码中包含了一行变量未定义的“rm -rf {foo}/{bar}”,连备份也没有了!
在谈这个问题前我们先来科普一下rm -rf 命令到底是什么鬼。
rm 是 linux系统下删除文件的命令-r 代表删除这个下面的一切一切的一切,all的allf 表示不要用户确认,是直接执行的那种通常这个命令都是指定文件夹用的举个例子来说明rm -rf /home/test/
就是指删除/home/test/这个文件夹下面的所有东西但是如果后面的文件夹路径有加对.........rm -rf /的后缀那么就意味着整个服务器数据就会全部删除。
这个小哥当然不会傻到直接去执行这个变态的命令小哥表示当时他正在运行一个BASH脚本但是脚本里似乎有一个问题导致执行这个删除命令的时候删除指定文件夹的那个参数没有传递过去结果就……
还不明白?那我给你举个简单的例子我现在让张三在电脑上删除一个名叫“game”的文件夹中的内容。我=那个倒霉的程序小哥,张三=一个程序脚本。我原本给张三下的指令是把电脑上名叫game的文件夹中的内容删除结果张三可能是没明白我的意思,或者漏掉我所下的指令,给我吧整个电脑上所有的文件夹都删除了。
很遗憾小哥再次表示当时为了执行维护他把远程的备份的驱动器也挂在了这个服务器上于是所有的东西也就顺带这么一起删掉了。
你以为事情就这样完了?还没有还有后续这一错误源自 Ansible 上糟糕的代码设计这款 Linux 实用工具被用于在多台不同服务器上自动执行脚本
开发者又进一步解释道实际参数应该是“rm -rf {foo}/{bar}”。foo 和 bar 是脚本中动态传递的两个变量。然而由于变量处理出错,通用语法未能成功在 bash 命令中插值,所以最终指令就变成了可怕的“rm -rf /”。 “rm -rf/”意味着擦除根路径“/”下挂载的所有内容且而无需询问。
原本这些数据是可以恢复的(只是时间长短的问题)。但由于未能妥善实现生产环境和备份环境的隔离,备份文档也就上了天堂或者下了地狱--全没了。
事实上,很多运维人员会使用一些工具进行维护,然而在很大程度上服务器托管运维人员并不知道这些工具的原始代码是不是有bug,而这些bug会不会给用户的主机数据带来毁灭性的影响。所以用户在进行维护的时候最好做好备份数据的隔离措施。