Rootとして実行される次のコマンドの破壊力は誰もが知っています。
rm -rf /
関連する質問:
この特定のパラメーターの組み合わせがいつ役立つかわかりません。システム全体が破壊され、それを行うためのより効率的な方法があるからです。 rm
コマンドは、これらの特定のパラメーターをチェックし、何らかのセーフガードを実装できます。-f
パラメーターにもかかわらず、少なくとも確認を求めてください。
rm
コマンドにそのような保護手段がないのはなぜですか?
Rootとしてコマンドを実行するときは、特に注意する必要があることをよく知っています。 大きな力で(...)。しかし、この特定のケースはその規則の例外ではありませんか?
分布によって異なります。私が現在使用している古いLinuxはそれを許可し(私はそれをテストしなかったと思います:-))、man rm
で述べています:
--no-preserve-root do not treat '/' specially (the default)
--preserve-root
fail to operate recursively on '/'
最近の多くのディストリビューションでは、セーフガードを無効にするために--no-preserve-root
を明示的に追加する必要があります。そうしないと、実行に失敗します。
Ubuntuについては、この動作について説明している この問題 を参照してください。
ウィキペディア によるこの保護の歴史:
Sun Microsystemsは、2005年に最初にリリースされたSolaris10に
rm -rf /
保護を導入しました。コマンドを実行すると、システムは/
の削除が許可されていないことを報告するようになりました。その後まもなく、同じ機能がFreeBSDバージョンのrm
ユーティリティに導入されました。 GNUrm
は、rm -rf /
オプションが指定されている場合、--preserve-root
の実行を拒否します。これはGNU CoreUtilitiesは2006年にリリースされました。
Rmコマンドにそのような保護手段がないのはなぜですか?
すでに3つのセーフガードがあります。
-r
_スイッチ。これがないと、ディレクトリを削除できません。-i
_スイッチ。削除するように要求したものを実際に削除することを確認します。 rm
を_rm -i
_にエイリアスすると、_-f
_スイッチを追加してオフにしない限り、そのセーフガードがオンになります。root
以外のすべてのユーザーがルートディレクトリを削除できなくなります。Unixツールセットはチェーンソーのようなものです。非常に強力なことを実行し、自分が何をしているかを理解している人々が使用できるように設計されています。不用意に踏むと怪我をする可能性があります。これは、経験者が間違いを犯さないということではありません。明らかに、Sunやその他の人々は、root
を持つユーザーを自分自身から保護する必要があると感じています。
しかし、この特定のケースはその規則の例外ではありませんか?
少なくとも1980年代以降、なぜrm
チェーンソーにブレードガードをかぶせることができないのかと人々は尋ねてきました。 (おそらくもっと長いですが、Unixでの私の歴史はそれ以上遡ることはありません。)あなたは自分自身にもっと質問をしなければなりません:
例外を追加しているので、他に何を神聖と見なすべきですか? _rm -rf /*
_のような同じように壊滅的な間違いを避けるために、ルートディレクトリ内の何かの再帰的な削除を防ぐ必要がありますか?ユーザーのホームディレクトリはどうですか? _/lib
_または_/bin
_はどうですか?従来とは異なるファイルシステムレイアウトのシステムでこれらの間違いを防ぐために、特別なバージョンのrm
が必要でしょうか?
これらの禁止事項の施行はどこに置きますか? rm
だけですか、それともカーネルにその仕事を与えますか? rm
は実際には何も削除しないため(引数に基づいてunlink(2)
とrmdir(2)
を何度も呼び出します)、カーネルが削除する方法はありません。 rm
が実際にそれを削除する瞬間が来るまで_/
_を本当に狙っていたことを検出します。成功するrmdir(2)
の唯一の呼び出しは、ターゲットディレクトリが空の場合であるため、_/
_でそのポイントに到達すると、システムはすでに完了していることを意味します。