“小故事,大事故”这个程序员一行代码就把整个公司都删没了
这个程序员叫做:Marco Marsala,他运营一家小型的主机托管公司,已经为1500多个客户提供服务器和网站托管业务,对于一个程序员兼系统管理员来说,还算运营的不错。
不过他最近遇到了一个天大的麻烦,不小心运行了一行代码,把客户所有数据都删完了,并且运行这个命令的时候,那个备份硬盘和他操作的服务器是联通状态,所以顺利实现双杀,备份文件也都消失了,这样他就一行代码就把整个公司都删没了。
wtf
他运营的代码脚本一个 Bash 脚本,里面有一行“rm -rf {foo}/{bar}”命令,我们来解释一下这个命令的意思,让你来了解一下Marco Marsala悲剧的来源:
rm是Linux系统的删除命令,这里用到两个参数:
-r是recursive(递归),意思是如果要删除文件夹里面还有文件夹,就会先删除文件夹,就是说要删除的东西里面有文件夹必须要使用-r。
-f是force(强制),意思是直接删除,不用返回确认删除的信息。
然后 {foo}/{bar} 是用来指定要删除的文件夹和文件,问题就是出现这里,因为这 {foo}/{bar} 是脚本中动态传递的两个变量,正常情况下,如果脚本传递成功,就只是删除 {foo}/{bar} 这个文件夹或者文件。
但是由于变量处理出错,所以最终指令就变成了可怕的“rm -rf /”,“rm -rf/”意味着无需确认删除服务器根目录“/”下的所有内容。
不过他最近遇到了一个天大的麻烦,不小心运行了一行代码,把客户所有数据都删完了,并且运行这个命令的时候,那个备份硬盘和他操作的服务器是联通状态,所以顺利实现双杀,备份文件也都消失了,这样他就一行代码就把整个公司都删没了。
wtf
他运营的代码脚本一个 Bash 脚本,里面有一行“rm -rf {foo}/{bar}”命令,我们来解释一下这个命令的意思,让你来了解一下Marco Marsala悲剧的来源:
rm是Linux系统的删除命令,这里用到两个参数:
-r是recursive(递归),意思是如果要删除文件夹里面还有文件夹,就会先删除文件夹,就是说要删除的东西里面有文件夹必须要使用-r。
-f是force(强制),意思是直接删除,不用返回确认删除的信息。
然后 {foo}/{bar} 是用来指定要删除的文件夹和文件,问题就是出现这里,因为这 {foo}/{bar} 是脚本中动态传递的两个变量,正常情况下,如果脚本传递成功,就只是删除 {foo}/{bar} 这个文件夹或者文件。
但是由于变量处理出错,所以最终指令就变成了可怕的“rm -rf /”,“rm -rf/”意味着无需确认删除服务器根目录“/”下的所有内容。
2 个评论
谢谢分享。
这是一条足以让LINUX运维工程师颤抖的命令行,哈哈。