您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

我写了一个Bug,错误地执行了rm -fr /*。我删了库。我必须跑吗? {企业网站源码}

  • 时间:2022-06-12 02:14 编辑: 来源: 阅读:307
  • 扫一扫,手机访问
摘要:我写了一个Bug,错误地执行了rm -fr /*。我删了库。我必须跑吗? {企业网站源码}
作者:小林参考链接:https://www.cnblogs.com/xiaolincoding/p/12809812.html每日英语,每天进步一点点(窃笑):image.png前言五一将至,小林一想到要放五天假就开始飘。 我甚至不在乎写一个简单的Bash脚本。写完了我都不检查。我只是把它拖到物理服务器上。 结果刚开始运行就出问题了。一个简单的脚本怎么可能运行了10秒钟才完成?所以它立即用一个直接的ctrl+c操作停止了正在运行的脚本。 然后,习惯性的输入ls,结果是什么?没有找到Ls命令?Image.png背后瞬间一凉,慌慌张张打开了剧本。 发现问题了,小林。我写了一个愚蠢的Bug,间接执行了rm -fr /*。不就是说我删库了吗?这是image.png公司的授权服务器。由于小林的努力,公司历史和其他重要信息的授权记录丢失了。惊慌失措的小林把这件事告诉了我的朋友。朋友建议我尽快向领导汇报,不要对删除数据库保密。 所以小林跟领导说我删库,我以为会被严厉批评。 结果领导笑着说:“没事。请先看看重要文件是否还在。” 但是,做完这些,突然想到编译服务器已经半年没备份了。我先把我的编译服务器备份一下,万一哪天你把库删了。 我:“????"你以为小林要删库跑路?哈哈,小林没有逃跑,而是恢复了,那就说说小林是怎么“从删库到恢复”的吧。 探究犯罪现场的文字,看看小林写的垃圾代码是如何触发这个数据库删除的。 由于rm -fr /*发生在image.png,所以变量new_lic_dir必须为空。 因此,当执行rm -fr $new_lic_dir/*语句时,它将成为rm -fr /*删除语句。 很好,凶器找到了。 那为什么new_lic_dir是空的?细心的朋友一定注意到了,因为给new_lic_dir变量赋值的时候用到了反引号。 Image.png,是的,是反引号的原因。 反引号在Linux Shell命令行中有一个特殊的含义:反引号之间的内容将由Shell首先执行。 在它的输出被放入主命令之后,主命令被再次执行。 也就是说new_lic_dir的值是${lic_path}/new_license命令的结果。问题是,这不是一个命令,所以我们必须向new_lic_dir变量返回一个空值。 小林写的温柔代码,原来是恶毒的删库代码。 找到了Image.png,后引号要改成双引号。 小林,你真是个植物人。你把所有简单的赋值命令都写错了。 哈哈,是真的。我跟你说了,都快五一了,小林还在写这段代码飘来飘去。 所以习惯性打开程序员内容的第一武功:crtl+c和CRTL+V 第一个赋值lic_path=pwd语句被复制粘贴,然后只修改了变量名,没有注意到后面的引号被改成了双引号,造成了库删除的悲剧。 保留犯罪现场。因为发生了数据库删除,所以不要重启服务器或关闭ssh会话。相反,保留犯罪现场,检查留下了什么。 小林,这不是吹大炮吗?Ls没了,怎么查?幸运的是,这一次,我很幸运。我在执行脚本的时候,第一时间发现了不对劲,马上把还在运行的脚本剪掉了,所以Linux的文件并没有全部被删除。 只要我捏的快,RM-fr/就不会杀我。 *虽然ls被删了,但好在cd命令还能用。 只要cd用得好,也能产生ls效应。 很简单,只要按cd+Tab键就会自动出现指定目录下的所有文件。 在image.png用cd+Tab键可以查看每个目录下的文件,这样就可以一步步确认哪些系统文件被删除了。 经过一番确认对比,发现删除了四个目录,分别是/bin、/boot和/dev,全部删除。删除了/lib目录下的动态库,来回顾一下以上四个目录主要存储了什么:/bin存储了常用的系统命令,ls、cp、rm、chmod等常用命令都在这个目录下;/boot系统引导目录,保存与系统引导相关的文件,如内核文件和引导程序;/dev工具文件保存位置;/lib存储程序所需的动态库和静态库文件;/boot已被删除。还好小林没有重启服务器。如果服务器重新启动,它将是完整的,系统将无法启动。 命令cd在/sin目录下,/sin还是声音,所以cd可以正常使用。 幸运的是,重要的数据库信息和文件没有被删除,所以Kobayashi的主要目标是恢复四个目录:/bin、/boot、/dev和/lib。 由于参考副本是从/bin目录和/lib中的一些动态文件中删除的,所以文件传输的常用方法,如ftp、scp、mount等。,不能使用。 小林摸索了半天,发现wget可以用。wget命令位于/usr/bin目录中。好在/usr/bin还是健全的。 所以我们用了一个比较棘手的方法,先另一个普通服务器,把/bin目录放在Web服务器的Web目录下,然后通过wget下载。 Image.png有机会看到成功的曙光。 但是新的问题来了。我下载的命令文件没有执行权限。 image.png chmod命令位于/bin目录中,它也已被删除,因此不能用于授予文件权限。 另外,我在网上找到了一个很棒的命令perl,可以用来授予文件权限:perl-e“chmod 777,‘ls’”真是一个神奇的命令。 好了,现在赋值权限问题处理好了,成功在望。 Wget不能直接下载/bin目录,只能下载一个文件。 但是小林,我不能一个一个下载来还原。完成它需要几年甚至几个月的时间。 小林想到了一个方法:先通过wget下载tar命令,然后通过perl赋予tar命令权限,再由另一个服务器将/bin目录打包成压缩文件,再通过wget下载bin目录的压缩文件,最后通过tar命令解压bin目录的压缩文件。/bin就这样恢复了,其余的目录也通过相同的操作恢复了。 小林的笑容渐渐恢复了。哈哈哈哈哈哈哈哈哈image.png遇到rm -fr /*数据库删除事件,一定要沉住气,稳住心态。小林之所以能从这次数据库删除事件中幸运恢复过来,有两个关键点:小林发现脚本执行异常,果断立即将其切断,没有造成重要数据库信息被删除。如果后来被剪掉了,可能真的就没了。 小林发现常用命令无法使用时,没有重启服务器,否则服务器上不去,也没有关闭ssh会话,否则无法重新连接ssh会话,无法操作。 以上两点做不好,服务器恢复的难度会增加很多,更严重的是五一就过了。 防止image.png误执行rm -fr /*既然rm -fr /*是一种残忍的武器,那就要防止。接下来,我们将与您讨论几种方案来防止它。 方案一:rm -rf删除目录时要判断目录号!/bin/bashwork_path=`pwd`#如果目录不为空,则删除if [${work_path}!= "" ];然后rm -fr ${work_path}/*fi在删除目录之前,判断要删除的目录是否可以为空,然后删除。 方案二:当Shell脚本指定set -u执行脚本时,如果遇到不存在的变量,Bash会默认忽略。 #!/bin/bashecho $aecho hello在上面的代码中,$a是不存在的变量,执行结果如下 $ Bash test.shhello可以发现echo $a输出一个空行,Bash忽略不存在的$a,然后继续执行echo hello。 最好遇到不存在的变量,脚本应该报错而不是默默执行。 Set -u用于改变这种行为。当它被添加到脚本中时,它会在遇到不存在的变量时报告错误,并停止执行。 #!/bin/bash set-urm-fr $ a/* echo hello运行如下:$ bashtest.shtest.sh: line4: a:无界变量。正如您所看到的,因为a是一个未定义的变量,所以脚本报告了一个错误,并且不再执行下面的语句。 方案三:安全——rm替代RM。safe-RM是一款开源软件工具。这个名字听起来很安全,所以用来代替不太安全的rmsafe-rm。 它可以在/etc/safe-rm.conf中配置路径黑名单,定义哪些是safe-rm不能删除的。 我们可以将safe-rm重命名为rm。假设定义并删除了/etc/unability,删除/etc时会报错:$ rm-rf/etc/safe-rm:跳过/etc/Scheme 4:建立回收站机制Windows有回收站,即使误删也可以在回收站恢复。 因此,我们也可以在Linux中实现回收站机制。 实现思路:删除文件时,并不真正执行删除操作,而是将文件移动到特定的目录下。可以设置一个定时明确的回收站,或者当回收站中的文件大小达到一定容量时(或者你用时间来判断),可以执行删除操作来腾出空间。 您可以编写一个Shell脚本来替换rm命令,或者在需要删除文件时使用mv命令将文件移动到回收站。 ①创建回收站目录mkdir /home/。trash②用以下内容编写remove.sh脚本:image③ Modify ~/。bashrc,并将rm命令别名RM = "sh/home/remove.sh "替换为我们自建的remove.sh. ④设置crontab,定时清空垃圾箱。比如每天0点清空垃圾桶:00 * * rm-rf/home/。trash/* ⑤最后执行以下命令使其生效。来源~/。bashrc方案5:在/etc/fstab文件中以只读方式挂载根文件,以只读方式挂载/file系统。 image.png重新挂载ro意味着只读挂载。 以只读方式挂载后,删除操作无法成功:image.png事后会对涉及rm -fr命令的代码进行反思,所以要盯紧,反复检查,做好防止rm -fr /*错误执行的工作,在测试机验证后拖到物理机上。千万不要大意。 即使rm -fr /*发生了,也要第一时间阻止,做到三不:不要慌,不要心跳(稳),不要藏删库(不要脸),不要重启服务器或断开ssh会话(保持现场),只要马上切断rm -fr /*就行,不会要了我们的命。 通过利用当前环境中剩余的命令并冷静地分析它们,有机会恢复。


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部