解決策 1:
私が従うトリックの 1 つは、 #
を置くことです。 最初に rm
を使用している間 コマンド。
[email protected]:~# #rm -rf /
これにより、誤って rm
が実行されるのを防ぐことができます 間違ったファイル/ディレクトリに。確認したら、#
を削除します 最初から。 Bash では #
で始まる単語があるため、このトリックは機能します。 その単語とその行の残りのすべての文字が無視されます。したがって、コマンドは単純に無視されます。
または
重要なディレクトリを防ぎたい場合は、もう 1 つのトリックがあります。
-i
という名前のファイルを作成します そのディレクトリに。このような奇妙なファイルはどのように作成できますか? touch -- -i
の使用 または touch ./-i
rm -rf *
を試してみてください :
[email protected]:~$ touch {1..4}
[email protected]:~$ touch -- -i
[email protected]:~$ ls
1 2 3 4 -i
[email protected]:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'?
ここでは *
-i
を展開します コマンドラインに追加されるため、コマンドは最終的に rm -rf -i
になります。 .したがって、コマンドは削除する前にプロンプトを表示します。このファイルを /
に入れることができます 、 /home/
、 /etc/
など
または
--preserve-root
を使用 rm
のオプションとして . rm
で 新しい coreutils
に含まれています パッケージの場合、このオプションがデフォルトです。
--preserve-root
do not remove `/' (default)
または
safe-rm を使用
Web サイトからの抜粋:
<ブロック引用>Safe-rm は、/bin/rm をラッパーに置き換えることにより、重要なファイルの偶発的な削除を防ぐことを目的とした安全ツールです。このラッパーは、指定された引数を、絶対に削除してはならないファイルとディレクトリの構成可能なブラックリストと照合します。
これらの保護されたファイルまたはディレクトリのいずれかを削除しようとするユーザーは削除できず、代わりに警告メッセージが表示されます:
$ rm -rf /usr
Skipping /usr
解決策 2:
あなたの問題:
<ブロック引用>誤って rm -rf /* を実行しましたが、これは rm -rf ./* を意味していました (スラッシュの後の星に注意してください)。
解決策:そうしないでください! 練習問題として、./
は使用しないでください。 パスの先頭に。スラッシュはコマンドに何の価値も与えず、混乱を招くだけです。
./*
*
と同じ意味 、したがって、上記のコマンドは次のように記述した方が適切です:
rm -rf *
ここに関連する問題があります。誰かが FOO
と仮定した次の表現をよく見かけます。 /home/puppies
のような値に設定されています .これは、今日、主要なソフトウェア ベンダーのドキュメントで実際に見たものです。
rm -rf $FOO/
FOO
の場合 が設定されていない場合、これは rm -rf /
と評価されます 、システム上のすべてのファイルを削除しようとします。末尾のスラッシュは不要なので、練習問題として使用しないでください。
以下は同じことを行い、システムを破損する可能性が低くなります:
rm -rf $FOO
私はこれらのヒントを苦労して学びました。 14 年前に初めてスーパーユーザー アカウントを持ったとき、誤って rm -rf $FOO/
を実行してしまいました シェルスクリプト内から攻撃し、システムを破壊しました。他の 4 人のシステム管理者がこれを見て、「うん。誰でも一度はそうします。これがインストール メディア (36 枚のフロッピー ディスク) です。直してください」
--preserve-root
のようなソリューションを推奨する他の人もここにいます と safe-rm
.ただし、これらのソリューションは、すべての Un*xe バリアントに対応しているわけではなく、Solaris、FreeBSD、および MacOSX では機能しない可能性があります。また、safe-rm
では、使用するすべての Linux システムに追加のパッケージをインストールする必要があります。 safe-rm
に頼る場合 、新しい仕事を始めたときに safe-rm
がない場合はどうなりますか インストールされていますか?これらのツールは松葉杖であり、既知のデフォルトに依存して作業習慣を改善する方がはるかに優れています.
解決策 3:
これは「Serverfault」に関するものなので、こう言いたいです:
数十台以上のサーバーがあり、管理者/ユーザーの大規模なチームがある場合、誰か rm -rf
になります または chown
間違ったディレクトリです。
影響を受けるサービスを可能な限り最小限の MTTR で復旧させるための計画を立てる必要があります。
解決策 4:
最善の解決策は、rm
を使わないように習慣を変えることです
1 つの方法は、echo rm -rf /stuff/with/wildcards*
を実行することです。 最初。ワイルドカードからの出力が適切に見えることを確認してから、シェルの履歴を使用して、echo
なしで前のコマンドを実行します。 .
もう 1 つのアプローチは、echo
を制限することです。 何を削除するかが目に見えないほど明白な場合にコマンドを実行します。ディレクトリ内のすべてのファイルを削除するのではなく、ディレクトリを削除して新しいディレクトリを作成します。良い方法は、既存のディレクトリの名前を DELETE-foo
に変更することです 、次に新しいディレクトリ foo
を作成します 適切な権限を付与し、最後に DELETE-foo
を削除します .この方法の副次的な利点は、履歴に入力されたコマンドが rm -rf DELETE-foo
であることです。 .
cd ..
mv somedir DELETE-somedir
mkdir somedir # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir # just to make sure we're deleting the right thing
rm -rf DELETE-somedir
ディレクトリを残す必要があるため (ディレクトリが常に存在する必要があるため、またはディレクトリを再作成する権限がないため)、ファイルの束を削除することを本当に主張する場合は、ファイルを別のディレクトリに移動し、そのディレクトリを削除します。 .
mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME
(その Alt を押します +. キー)
rm -rf .
であるため、内部からディレクトリを削除するのは魅力的です。 短いため、タイプミスのリスクが低くなります。残念ながら、一般的なシステムではそれができません。 rm -rf -- "$PWD"
できます 代わりに、タイプミスのリスクが高くなりますが、ほとんどの場合、何も削除されません。これにより、シェル履歴に危険なコマンドが残ることに注意してください。
可能な限り、バージョン管理を使用してください。あなたは rm
しません 、あなた cvs rm
または何でも、それは元に戻すことができます.
Zsh には、rm
を実行する前にプロンプトを表示するオプションがあります ディレクトリ内のすべてのファイルをリストする引数付き:rm_star_silent
(デフォルトでオン) rm whatever/*
を実行する前にプロンプトを表示します 、および rm_star_wait
(デフォルトではオフ) 確認できない 10 秒の遅延が追加されます。ディレクトリ内のすべてのファイルを削除する場合は、プロンプトが表示されることを想定しているため、これは使用が制限されます。 rm foo *
のようなタイプミスを防ぐのに役立ちます rm foo*
の場合 .
rm
を変更することを含む多くのソリューションが浮かんでいます 指図。このアプローチの制限は、ある日、実際の rm
を持つマシンにいることです。 自動的に rm
を呼び出します 、確認を期待して安全です...そして次はバックアップを復元します。
解決策 5:
あなたが言及したように、いつでもエイリアスを作成できます:
what_the_hell_am_i_thinking() {
echo "Stop." >&2
echo "Seriously." >&2
echo "You almost blew up your computer." >&2
echo 'WHAT WERE YOU THINKING!?!?!' >&2
echo "Please provide an excuse for yourself below: "
read
echo "I'm sorry, that's a pathetic excuse. You're fired."
sleep 2
telnet nyancat.dakko.us
}
alias rm -fr /*="what_the_hell_am_i_thinking"
また、コマンドライン Twitter クライアントと統合して、rm -fr /*
でハードディスクをワイプして屈辱を与えそうになったことを友人に警告することもできます。 ルートとして。