なぜファイルシステム全体を削除できるのですか?


24

を介してファイルシステム全体を削除するという悪名高い間違いを犯した後sudo rm -rf /*、私が行った恐ろしい損害から回復し、寿命から6年を失ったばかりの事実に対処した後、なぜそれが可能なのかと疑問に思い始めました。この間違いの発生を防ぐために何ができるか。

私に提案された解決策の1つは、アカウントからルートアクセスを取り消すことですが、多くのコマンドにはルートアクセスが必要であり、毎日数十個のコマンドを実行する必要があるため、面倒です。

システムをバックアップするのは明らかな方法です。ただし、バックアップの復元にはある程度のダウンタイムも必要です。システムによっては、ダウンタイムが数日または数週間になることがあり、場合によっては許容できない場合があります。

私の質問は次のとおりです。ユーザーがファイルシステムを削除しようとしたときに確認を実装しないのはなぜですか。そのため、実際にそれを実行したい場合は、Yを押すか入力するだけで、少なくともそうしなければすべてを失うことはありません。


参照してくださいserverfault.com/q/337082

20
「なんでそんなこともできるの?」なぜshould'tことは可能?ディレクトリ階層のコンテンツを削除する理由は完全にありますが、削除するの/と同じくらい悪いサブセットがたくさんあります(/etc/たとえば)。rm簡単に削除できるディレクトリまたは削除できないディレクトリを決定するのは、単に仕事ではありません。
chepner

2
タイトルには「なぜシステムを削除できるのですか?」質問自体は「私の質問は次のとおりです。ユーザーがファイルシステムを削除しようとしたときに確認を実装しないのはなぜですか?」したがって、これは質問を不明確にします。あなたの実際の質問はどれですか?投稿を編集して明確にしてください
Sergiy Kolodyazhnyy

3
ここで実際に質問は何ですか?次の3つを見ることができます:(1)なぜそれが可能ですか?(2)実行を防ぐ方法、および(3)確認を実装しない理由 -それらは同じ質問ではなく、最初は推論を求め、2番目はツールを求めます。(3番目は2番目に関連していますが、実際には同じではありません。確認が何かを防ぐ唯一の方法ではありません。)
ilkkachu

10
質問の著者に説明を求めていない場合は、コメントしないでください。フラグの意味がわからない、またはバックアップなどを持たないことのOPの欠点を説明する、多くの自慢のコメントがここにあります。私たちのユーザーの多くがバックアップをとるのに十分賢く、理解できないコマンドを実行しないことを知ってとてもうれしいです。それは彼らにとって絶対に素晴らしいことですが、おそらく今までにこの教訓を学んだOPにとっては根本的に役に立たないでしょう。それでは、私たち自身の輝きに浸ることをやめて、質問に答えてみましょう。
テルドン

回答:


16

rm低レベルのシステムツールです。これらのツールは、すべてのシステムに存在する必要があるため、できるだけ簡単に構築されます。rm特に確認プロンプトに関しては、スクリプトで使用できるように、よく知られた動作が期待されます。

rm /*rmコマンドはこの形式でそれを表示しないため、プロンプトを表示する特別なケースを追加することはできません。*ワイルドカードはに渡される前に、シェルによって展開されているrmので、特別なケースを必要とする実際のコマンドは次のようなものになるだろうrm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz。このケースをチェックするコードを追加することは(おそらく異なるLinuxでは異なるでしょう)微妙なエラーを起こしやすいだけでなく、複雑な課題になります。標準のLinuxにrm/--no-preserve-rootオプションなしで削除を拒否することにより、システムの破壊に対するデフォルトの保護があります。

デフォルトでは、この方法でシステムを削除することに対する3つの保護があります。

  1. アクセス許可-通常のユーザーは重要なファイルを削除できません。sudoでこれをバイパスしました
  2. ディレクトリ-デフォルトでは、rmはディレクトリを削除しません。-rフラグでこれをバイパスした
  3. 書き込み保護されたファイル-デフォルトでは、rmは書き込み保護されたファイルを削除する前に確認を求めます(これによりすべての損傷が停止するわけではありませんが、システムが回復不能になる前にプロンプ​​トが表示される場合があります)。-fフラグでこの保護をバイパスした

むしろ実行しているよりも、フォルダの内容をすべて削除するにはrm /path/to/folder/*、実行しrm -rf /path/to/folder、その後、mkdir /path/to/folderこのようトリガする--preserve-rootフォルダ内の任意のドットファイルを削除するだけでなく、保護を


3
「rmはよく知られた振る舞いをすることが期待されています」そして実際にはPOSIX標準によって指定されたツールの1つです。「彼*ワイルドカードはrmに渡される前にシェルによって展開されます」正確に、すべてのタイプのパラメーターのチェックを追加します。これは、実際のディレクトリーおよびファイルへのシンボリックリンクである可能性があり/、多くの組み合わせと考慮が必要になるため、実用的ではありません。そして、標準の考え方に戻って、このようなチェックを追加すると、一貫した動作が壊れます
Sergiy Kolodyazhnyy

それがまさにsafe-rmラッパーrmです:この方法では、(ランダムなコマンドライン全体の代わりに)すべての単一の引数をチェックし、設定可能なブラックリストにないことを確認してからrm、検証された引数で呼び出します。それは非常に複雑でもエラーの原因にもなりません。
デザート

59

safe-rmsafe-rmをインストールするrm偶発的な削除を防ぐためのコマンドのラッパー」に会います。

safe-rmは、削除rmすべきでないファイルとディレクトリの設定可能なブラックリストに対して指定された引数をチェックするラッパーに置き換えることにより、重要なファイルの偶発的な削除を防ぎます。

これらの保護されたファイルまたはディレクトリのいずれかを削除しようとすると、ユーザーは削除できず、代わりに警告メッセージが表示されます。(man safe-rm

上記のインストールリンクが機能しない場合は、sudo apt install safe-rm代わりに使用してください。デフォルトの設定にはすでにシステムディレクトリが含まれています。rm /*たとえば、次を試してみましょう。

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var
…

ご覧のとおり、これにより/home、個人ファイルが保存されていると思われるを削除できなくなります。ただし、~直接削除しようとしても、そのサブディレクトリを削除することはできません。~/precious_photosディレクトリを追加するには、チルダをsafe-rmconfigファイルに解決した絶対パスを追加するだけです/etc/safe-rm.conf(例:

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

あなたが実行する場合のためにrmすることなく、sudo1-fフラグそれがすることをお勧めします追加しaliasますことをごシェルのためrm-iフラグのデフォルト。この方法でrmは、削除する前にすべてのファイルを要求します。

alias rm='rm -i'

同様に有用なフラグは-I、「3つ以上のファイルを削除する前、または再帰的に削除する場合」に警告するだけで-i、「ほとんどの間違いに対する保護を提供しながら、より侵入的ではありません」:

alias rm='rm -I'

これらのエイリアスの一般的な危険性は、それらを使用してあなたを救う習慣に簡単に陥ることです。これは、異なる環境を使用するとひどく裏目に出る可能性があります。


1:sudoエイリアスを無視しますが、定義することで回避できalias sudo='sudo 'ます


25

確認はすでにそこにあります。問題は-fコマンドにあり--forceます。ユーザーが操作を強制すると、ユーザーは自分が何をしているのかを知っていると想定されます(明らかに間違いが常に追加される可能性があります)。

例:

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

--forceオプションとは異なります:確認メッセージが表示されず、ファイルが削除されます。

問題は、より多くので、コマンドとそのパラメータ、ナビゲート知っているman例については、(コマンドは、チュートリアルで発見された場合にも)コマンドのを:私はコマンドを初めて見たがtar xzf some.tar.gz、私は何がありません「、自分自身を求めているxzf意味ですか? 」

次に、tarのマンページを読んで、それを発見しました。


ここでは関係ないと思います。rmが最初に書き込み保護されたファイルまたは任意のファイルを要求した時点で、重要なファイルがすべて削除されている場合があります。
ジョナスシェーファー

1
個人的に、私はいつも-fフォルダを削除する必要があると考えてきました。確認して苦情を申し立てるプロンプトを開きましたが、-r必要なのはそれだけです。rm -rfスクリプトで非常に便利なので(存在しないものを削除しようとしているからといってスクリプトを失敗させたくないので)標準になったと思われます。rm -rシェル内で「デフォルト」として使用することだけに注意してください(特にsudoの場合、理解できない「デフォルト」の仮定はないはずですが、人々は人々であり、少なくともこれはより安全です)。
キャプテンマン

2
Rmdirは、フォルダを削除する最も安全な方法です
AtomiX84

rmデフォルトでは確認を求めず、書き込み保護されたディレクトリとファイルのみを求めます。マシンでそのコマンドを実行した場合は、おそらく多くの独自のファイルを削除したでしょう。rm確認を求める必要がある場合は、-iパラメーターを渡す必要があります。例:rm -ir ./*
ダン

8

バックアップなしで実行すると、間違いを犯さないように細心の注意を払う必要があります。そして、ハードウェアが決して故障しないことを願っています。(RAIDでさえ、RAMの故障によるファイルシステムの破損からあなたを救うことはできません。)それがあなたの最初の問題です。(私はあなたがすでに気づいており、将来バックアップを行うと仮定します。)


しかし、次のような間違いの可能性を減らすためにできることがあります。

  • rm='rm -I'3つ以上のものを削除する場合にプロンプ​​トを出すエイリアス。
  • エイリアスmvおよびcp to mv -iおよびcp -i(これらの多くの通常のユースケースは、宛先ファイルの上書きを伴いません)。
  • エイリアスsudo='sudo 'の最初の引数にエイリアス展開を行うにはsudo

私が見つけるrm -Iよりもはるかに便利ですrm -i。通常、通常の使用中はプロンプトが表示されないため、予期しないときにプロンプ​​トが表示されます。-i(私が発見する前に-I)、私はタイピングに慣れ\rm無効エイリアスの展開に、必ずされた後、私はコマンドを正しく入力したと思います。

あなたはあなたを救うためにエイリアスrm -i-Iエイリアスに頼る習慣になりたくありません。あなたが決して使われないことを望むのはあなたの安全線です。実際に削除する一致をインタラクティブに選択したい場合、または私のグロブがいくつかの余分なファイルと一致するかどうかわからない場合は、手動で入力しrm -i .../*whatever*ます。(別名のない環境にいる場合にも良い習慣です)。

最初Enterls -d /*foo*入力し、次に上矢印rm -rキーを押して太りすぎを防ぎ、入力が終了したらそれを変更します。そのため、コマンドラインにはrm -rf ~/、いかなる点でも決して危険なコマンドが含まれることはありません。control-a、alt-dでに変更lsrmて行の先頭に移動し、コマンドの一部の入力が終了し-r-f後、またはを追加するだけで、「準備」できます~/some/sub/dir/

削除する内容に応じて、実際にls -d最初のコマンドを実行します。タブ補完で表示されるものに何も追加されない場合は、実際に実行します。あなたは、で始まるかもしれませんrm(なし-rまたは-rf/それだけで制御/制御権(またはALT + F)ですので)/スペース-r

(bash / readlineの強力な編集キーバインドに慣れて、control-arrowsやalt + f / bを使って単語ごとに移動したり、alt + backspaceまたはalt + d、control-wで単語全体を削除したりできます。 -uは行の先頭までを殺し、control- /は一歩先に進んだ場合に編集を元に戻します。もちろん、control-r / control-sで検索できる上矢印履歴。

読み取り専用ファイルの削除に関するプロンプトを黙らせるために-rf実際に必要な場合を除き、避けてください。

sudoコマンドでReturnキーを押す前に考える時間を余分にとります。 特に、完全バックアップがない場合、または今から完全バックアップを復元するのは悪い時期です。


6

短い答えは、そのようなコマンドを実行しないことです。

長い話は、それがカスタマイズの一部であるということです。基本的に、ここには2つの要素が関係しています。1つは、すべてのファイルを自由に変更できるという事実です。

2つ目は、rmコマンドが、フォルダー内のすべてのファイルを削除するための便利な構文シュガーを提供することです。

事実上、これはUnixマシンの単一の単純な教義として言い換えることができます。すべてがファイルです。問題を改善するために、アクセス制御がありますが、これらはあなたの使用によって上書きされます

須藤

エイリアスまたは関数を追加して、これが実行されないようにすることができると思います。


4

システムファイルスペースの使用量があまり大きくない場合(そして最近では「巨大」とは「数百ギガバイト以上」を意味します)、仮想マシンインスタンスをいくつか作成し、常にその内部で動作します。リカバリには、バックアップインスタンスの使用が必要になります。

または、chroot刑務所を作成して、その内部で作業することもできます。ゴミ箱に捨てられた場合でもまだ回復が必要ですが、実行中の(囲んでいる)システムの方が簡単です。


これはおそらく最も効果的な答えです。これは、サードパーティのスクリプトでさえ、あらゆる損害から保護できるためです。実際のマルウェアについて心配するだけで済みます。
PyRulez

別の角度の考え。そもそも再帰的な削除を行う必要がある理由を尋ねる価値があります。たぶん、本当に必要なのはなど、プロジェクトを削除するには、いくつかのスクリプトです
ローレンローゼン

「そもそもなぜ再帰削除を行う必要があるのか​​を尋ねる価値はあります。」さて、コマンドが組み込まれていないからといって、間違いを犯すことができないわけではありません。サードパーティのスクリプトは、ディレクトリからファイルを1つずつ削除する場合があります。また、1つのファイルに触れるだけでシステムを混乱させる他の方法があります。ただし、少なくとも置き換えるrmsafe-rm役立ちます。
PyRulez

スクリプトに関する私の考えは、「プロジェクト」などの組み込みの概念を持つということでした。おそらく、プロジェクトルートに、という名前の空のファイルがある.project_rootか、ファイルシステムがそれをサポートしている場合は、ディレクトリ自体の属性があります。次に、スクリプトはファイルツリーを上に移動してプロジェクトルートを探し、現在のディレクトリがプロジェクト内にないことを訴えます。または、プロジェクトがすべて同じ場所に存在する場合、スクリプトではプロジェクトに名前を付ける必要があります。間違ったプロジェクトを削除することはできますが、システム全体を破壊することはできません。
ローレンローゼン

...また、の変形はchrootDockerのようなものを使用することです(実際chrootにカバーの下で使用すると思います)。読むだけでよい他のファイルについては、読み取り専用ファイルシステムをマウントします。
ローレンローゼン

3

rmは非常に古いUnixコマンドであり、使いやすさを考慮して設計されていなかった可能性があります。許可があれば、要求されたとおりに正確に実行しようとします。多くの新規ユーザーにとっての落とし穴は、頻繁にコードを見ることがsudoあり、それを使用することについてあまり考えないことです。直接のようなファイル変更機能rmddchrootなどは、使用中に細心の注意が必要です。

最近では、trash(sudoなしで)trash-cliを使用しています。誤って削除したファイルを簡単に取得できるという点で、Windowsのごみ箱のように機能します。Ubuntuには既にファイルにゴミ箱フォルダーとゴミ箱への移動機能が組み込まれています。

それでもあなたは間違いを犯すかもしれないので、あなたのファイルシステム全体のバックアップを作成してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.