写了个Bug,误执行rm -fr /*,瞬间背后一凉


前几天 , 临近五一节 , 想到有 5 天假期 , 我就开始飘了 。 于是写个简单的 Bash 脚本都不上心了 , 写完后检都不检查 , 直接拖到到实体服务器跑 。
写了个Bug,误执行rm -fr /*,瞬间背后一凉
本文插图
图片来自 Pexels
结果一跑起来 , 发生不对劲 , 怎么一个简单脚本跑了 10 秒还没结束 , 于是立马 Ctrl+C 一顿操作停掉了运行中的脚本 。
写了个Bug,误执行rm -fr /*,瞬间背后一凉
本文插图
接着 , 习惯性的输入了 ls , 结果 what?找不到 ls 命令?
写了个Bug,误执行rm -fr /*,瞬间背后一凉
本文插图
瞬间背后一凉 , 慌慌张张打开了脚本 。 发现问题了 , 我写了个巨蠢的 Bug , 间接执行了 rm -fr /*, 这不意味着我删库了?
写了个Bug,误执行rm -fr /*,瞬间背后一凉
本文插图
这台是公司的授权服务器呀 , 被我这么一整 , 公司历史的授权记录和其他重要信息不就丢了?
心里慌的一批的我 , 跟我的朋友们说了这件事 , 朋友建议我先第一时间上报给 Leader , 不要把删库的事情瞒着 。
于是 , 我就向 Leader 说了我删库事情 , 本以为会被痛批一顿 。
结果 Leader 笑着说:“没事 , 你先看看重要的文件还在不在 。 不过你这么一整 , 我突然想起编译服务器半年没备份 , 我先备份一下我的编译服务器 , 防止哪天也被你们删库了 。 ”
我:“????”
吃瓜的小伙伴 , 是不是觉得我要删库跑路了?哈哈哈 , 我没跑路 , 反而是恢复了回来 , 所以接下来说说我是如何从删库到恢复的 。
初探案发现场
先来看看我写的垃圾代码 , 是如何引发这次的删库:
写了个Bug,误执行rm -fr /*,瞬间背后一凉
本文插图
既然发生了 rm -fr /* 的现象 , 那必然 new_lic_dir 这个变量是空的 。
所以导致执行 rm -fr $new_lic_dir/* 这条语句的时候 , 变成了 rm -fr /* 删库语句 。 很好 , 凶器找到了 。
那为什么 new_lic_dir 会是空的呢?细心的小伙伴肯定察觉出来了 , 是因为给 new_lic_dir 变量赋值的时使用了反引号 。
写了个Bug,误执行rm -fr /*,瞬间背后一凉
本文插图
没错 , 就是反引号的原因 。 反引号在 Linux Shell 命令行中有特殊的含义:反引号间的内容 , 会被 Shell 先执行 。 其输出被放入主命令后 , 主命令再被执行 。
也就是说 ,new_lic_dir 的值是 ${lic_path}/new_license 这条命令执行的结果 , 问题这哪是命令啊 , 所以肯定返回空值给 new_lic_dir 变量 。
我写的那么温柔的代码 , 竟然变成了穷凶极恶的删库代码 。
写了个Bug,误执行rm -fr /*,瞬间背后一凉
本文插图
这下原因是找到了 , 反引号应该改成双引号才对 。 (内心 OS:你真菜呀 , 那么简单的赋值命令都写错!)
哈哈哈 , 确实菜 , 都说了嘛 , 快五一了 , 是飘着写这份代码的 。 所以习惯性开启程序员内容的第一大武功:Crtl+C 和 Crtl+V 。
把第一条赋值 lic_path=`pwd` 语句 , 复制粘贴了 , 然后只改了变量名 , 没注意反引号要修改成双引号 , 所以造成了删库的悲剧 。
保留案发现场
既然发生了删库的事情 , 千万不要重启服务器 , 也不要关闭 SSH 连接的会话 , 而是要保留案发现场 , 接着查查还剩什么 。
PS:这不是吹大炮嘛?ls 都没了 , 还怎么查?