通过bash脚本意外删除数据库,请救援

问题描述 投票:18回答:3

我的开发人员犯了一个很大的错误,我们无法在服务器中找到我们的mongo数据库。救援请!!!

他登录到服务器,并在~/crontab/mongod_back.sh下保存了以下shell:

enter image description here

然后他运行qazxsw poi,然后有很多qazxsw poi,然后他做了./mongod_back.sh。然后服务器自动关闭。

他试图重新启动服务器,然后他得到了一个grub错误:

permission denied

然后,他联系了AliCloud,工程师将磁盘连接到另一个工作服务器,以便他可以检查磁盘。然后,他意识到有些文件夹已经消失了,包括Ctrl+C,其中mongodb是!!!

1)我们只是不明白bash如何破坏磁盘,包括enter image description here;

2)当然,有可能让/data/回来吗?

PS:他以前没有拍过磁盘的快照。

bash filesystems ubuntu-14.04 data-recovery disaster-recovery
3个回答
54
投票

Question 1

1)我们只是不明白bash如何破坏磁盘,包括/ data /;

Reason: /data/ was unset

/data/$OUT_DIR评论写作bash,而不是sh。 以下行将具有以下效果

# comment
  • // comment分配给变量someVariable=someValue // not a comment ,但仅限于那一行。在该行之后,变量将返回其旧值,在这种情况下为null。
  • 执行“命令”someValue,即程序someVariable,参数为// not a comment//not。由于a只是一个目录(与comment相同),这将导致错误消息,仅此而已。

现在这种行为可能看起来很奇怪,但你可能已经在像///这样众所周知的习语中使用过它。

查看脚本,以下行可能会导致问题:

IFS= read -r line

我很抱歉把这个带给你,但你基本上执行了LC_ALL=C sort,因为OUT_DIR=/data/backup/mongodb/tmp // ... ... rm -rf $OUT_DIR/* 扩展到空字符串。

Potential Risk On Other Systems

即使rm -rf /*不是空的,效果也可能是相同的,因为在$OUT_DIR之后有一个$OUT_DIR“评论”。考虑一下命令

//

这应该删除三个文件/目录rmrm -rf some // thing some。正如已经指出的那样,//thing是同一个目录。

但是,Linux上大多数//的实现都有这种情况的保护,不会轻易删除/。在Ubuntu上你会得到以下警告(不要在家里试试。如果你的rm不同,会很糟糕。)

/

Question 2

2)原因是,有可能获得/ data / back吗?

这是StackOverflow的主题。但是,你可以找到rm $ rm -rf // rm: it is dangerous to operate recursively on '//' (same as '/') rm: use --no-preserve-root to override this failsafe many answers to this question on other

您可以尝试使用恢复工具,但如果您没有备份,则无法保证可以恢复数据。


17
投票

在语言之间切换可能很棘手! stackexchange不是shell的评论首发,它是sites。带有这些“注释”的所有命令都被错误地解析并跳过:

//

因此,#被忽略,$ VAR=whatever // comment bash: //: Is a directory [$?=126] $ echo "($VAR)" () 是空的。很容易猜到是什么

OUT_DIR=...

然后呢。它基本上相当于

$OUT_DIR

使用备份还原数据库。


3
投票

我可以在注释字段中读取中文字条,从第10行开始,用户想要创建临时文件夹但是使用rm -rf $OUT_DIR/* ,所以如果rm -rf /* 首先不存在,那么$ OUT_DIR为空或者为null,之后第11行变为cd

© www.soinside.com 2019 - 2024. All rights reserved.