web-dev-qa-db-ja.com

bashスクリプトによって誤ってデータベースを削除しました、救助してください

開発者が大きなミスを犯したため、サーバーにmongoデータベースを見つけることができません。助けてください!!!

彼はサーバーにログインし、次のシェルを~/crontab/mongod_back.shに保存しました。

enter image description here

そして、彼は./mongod_back.shを実行し、次にpermission deniedがたくさんあり、そしてCtrl+Cを実行しました。その後、サーバーは自動的にシャットダウンします。

彼はサーバーを再起動しようとしたところ、重大なエラーが発生しました。

enter image description here

次に、エンジニアがディスクをチェックできるように、エンジニアがディスクを別の稼働中のサーバーに接続したAliCloudに連絡しました。その後、彼はmongodbがある/data/を含むいくつかのフォルダがなくなったことに気づきました!!!

1)bashが/data/を含むディスクをどのように破壊するか理解できません。

2)そしてもちろん、/data/を取り戻すことは可能ですか?

PS:彼は以前にディスクのスナップショットを撮りませんでした。

22
SoftTimur

質問1

1)bashが/ data /を含むディスクをどのように破壊するかを理解していません。

理由:$OUT_DIRの設定が解除されました

bashおよびshでは、コメントは# commentではなく// commentとして記述されます。
次の行には次の効果があります

someVariable=someValue // not a comment
  • someValueを変数someVariableに割り当てますが、その1行のみです。その行の後、変数は古い値に戻りますが、この場合はnullです。
  • "コマンド" // not a commentを実行します。つまり、プログラム//をパラメータnota、およびcommentで実行します。 //は単なるディレクトリ(/と同じ)であるため、エラーメッセージが表示され、それ以上は発生しません。

現在、この動作は奇妙に思えるかもしれませんが、IFS= read -r lineLC_ALL=C sortなどのよく知られたイディオムですでに使用している可能性があります。

スクリプトを見て、次の行が問題の原因である可能性があります。

OUT_DIR=/data/backup/mongodb/tmp // ...
...
rm -rf $OUT_DIR/*

申し訳ありませんが、rm -rf /*が空の文字列に展開されているため、基本的に$OUT_DIRを実行しました。

他のシステムの潜在的なリスク

$OUT_DIRが空でなくても、rmの後に// "コメント"があるため、効果は同じでした。コマンドを検討する

rm -rf some // thing

これは、3つのファイル/ディレクトリsome//、およびthingを削除することになっています。すでに指摘したように、///と同じディレクトリです。

ただし、Linuxのrmmost実装には、このケースに対するガードがあり、/を簡単に削除しません。 Ubuntuの場合、次の警告が表示されます(自宅ではこれを試さないでください。rmが異なる場合は問題があります。

$ rm -rf //
rm: it is dangerous to operate recursively on '//' (same as '/')
rm: use --no-preserve-root to override this failsafe

質問2

2)そして、当然のことながら、/ data /を取り戻すことは可能ですか?

これはStackOverflowのトピックから外れています。ただし、 多数回答tothisquestiononその他stackexchangeサイト

試すことができる回復ツールはありますが、バックアップがない場合にデータを復元できる保証はありません。

54
Socowi

言語の切り替えには注意が必要です。 //はシェルのコメントスターターではなく、#。これらの「コメント」を含むすべてのコマンドが誤って解析され、スキップされました:

$ VAR=whatever // comment
bash: //: Is a directory
[$?=126]
$ echo "($VAR)"
()

したがって、OUT_DIR=...は無視され、$OUT_DIRは空でした。何を推測するのは簡単です

rm -rf $OUT_DIR/*

その後しました。基本的には

rm -rf /*

バックアップを使用してデータベースを復元します。

18
choroba

コメントフィールドで中国語の文言を読み取ることができます。10行目から、ユーザーは一時フォルダーを作成したいがcdを使用しているので、/data/backup/mongodb/tmpが最初に存在しない場合、$ OUT_DIRは空またはnull、その後11行目がrm -rf /*になった。

4
user11275761