web-dev-qa-db-ja.com

偶発的なrm -rf / *を防ぐにはどうすればよいですか?

私はただ走ったrm -rf /*誤って、しかしrm -rf ./*(スラッシュの後の星に注意してください)。

alias rm='rm -i'および--preserve-rootデフォルトでは私を救うことができなかったので、これに対する自動保護手段はありますか?


私はrootではなかったため、すぐにコマンドをキャンセルしましたが、Bashプロンプトがすでに壊れていることに気付いたため、どこかに緩和されたアクセス許可がいくつかありました。私はパーミッションに依存したりrootになったりしたくありません(Sudoでも同じ間違いをする可能性があります)。また、システムのどこかにファイルが1つ見つからないため、不思議なバグを探したくありません。だから、バックアップとSudoは良いですが、この特定のケースにはもっと良いものが欲しいです。


二度考えて脳を使うことについて。実際に使っています!しかし、私はそれを使用して、10の異なるものを含むいくつかの複雑なプログラミングタスクを解決しています。私はこのタスクに深く没頭しています。フラグとパスをチェックするための頭脳の力は残っていません。コマンドと引数の観点からすら考えていません。「空の現在のディレクトリ」のようなアクションの観点から考えています。私の脳の別の部分がそれらをコマンドに変換し、時には間違いを犯します。私はコンピュータにそれらを修正して欲しい、少なくとも危険なものは。

165
Valentin Nemcev

私が従うトリックの1つは、rmコマンドを使用するときに#を最初に置くことです。

root@localhost:~# #rm -rf /

これにより、誤ったファイル/ディレクトリでrmが誤って実行されるのを防ぎます。確認したら、#を最初から削除します。このトリックが機能するのは、Bashでは#で始まるWordによって、そのWordとその行の残りのすべての文字が無視されるためです。したがって、コマンドは単に無視されます。

[〜#〜]または[〜#〜]

重要なディレクトリを禁止したい場合は、もう1つの方法があります。

そのディレクトリに-iという名前のファイルを作成します。このような奇妙なファイルを作成するにはどうすればよいですか? touch -- -iまたはtouch ./-iの使用

rm -rf *を試してください:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

ここで*-iをコマンドラインに展開するため、コマンドは最終的にrm -rf -iになります。したがって、コマンドは削除前にプロンプ​​トを表示します。このファイルを//home//etc/などに配置できます。

[〜#〜]または[〜#〜]

rmのオプションとして--preserve-rootを使用します。新しいrmパッケージに含まれるcoreutilsでは、このオプションがデフォルトです。

--preserve-root
              do not remove `/' (default)

[〜#〜]または[〜#〜]

safe-rm を使用します

Webサイトからの抜粋:

Safe-rmは、/ bin/rmをラッパーに置き換えることにより、重要なファイルが誤って削除されないようにすることを目的とした安全ツールです。ラッパーは、指定された引数を、削除すべきでないファイルとディレクトリの構成可能なブラックリストと照合します。

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

$ rm -rf /usr
Skipping /usr
221
Sachin Divekar

あなたの問題:

誤って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-rootsafe-rmのようなソリューションを推奨しています。ただし、これらのソリューションはすべてのUn * xeバリアントに存在するわけではなく、Solaris、FreeBSD、MacOSXでは機能しない場合があります。さらに、safe-rmでは、使用するすべてのLinuxシステムに追加のパッケージをインストールする必要があります。 safe-rmを使用している場合、safe-rmがインストールされていない新しいジョブを開始するとどうなりますか?これらのツールは松葉杖であり、既知のデフォルトに依存して作業習慣を改善する方がはるかに優れています。

47

これは「Serverfault」にあるので、これを言いたいのですが。

数十台以上のサーバーがあり、管理者/ユーザーのチームが多すぎる場合、someonerm -rfまたはchown間違ったディレクトリ。

影響を受けるサービスを最小限のMTTRでバックアップするための計画が必要です。

33
Not Now

あなたが言及したように、あなたはいつでもエイリアスをすることができます:

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 /*をルートとして。

19
Naftuli Kay

このスレッドには本当に悪いアドバイスがいくつかありますが、幸いにもそのほとんどは投票されていません。

まず第一に、あなたがルートになる必要があるとき、ルートになります-Sudoと様々なエイリアストリックはあなたを弱くします。さらに悪いことに、彼らはあなたを不注意にします。正しい方法で物事を行う方法を学び、あなたを保護するためにエイリアスに頼るのをやめます。ある日、あなたの補助輪のない箱に根を下ろし、何かを爆破するでしょう。

第二に-あなたが根を持っているとき、自分を学童でいっぱいのバスを運転していると考えてください。ラジオで曲に夢中になれることもあれば、両方の方向を見て、速度を落とし、すべてのミラーを再確認する必要がある場合もあります。

第三に-あなたはめったにない本当にrm -rf-可能性が高いmv something something.bakまたはmkdir _trash && mv something _trash/

4つ目-常にlsの前のrmワイルドカード-何かを永久に破壊する前に見ることに夢中になることはありません。

15
eventi

偶発的なrm -rf /*を防ぐ最も簡単な方法は、rmコマンドをすべて使用しないことです。実際、私は常にrm /bin/rmを実行してコマンドを完全に削除したくなってきました。いいえ、私は面白くありません。

代わりにfindコマンドの -deleteオプション を使用しますが、まずファイルを削除する前に、削除するファイルをプレビューすることをお勧めします。

find | less

findの最新バージョンでは、ディレクトリの名前を省略した場合、暗黙的に現在のディレクトリが使用されるため、上記は以下と同等です。

find . | less

これらが削除するファイルであることを確認したら、-deleteオプションを追加できます。

find path/to/files -delete

したがって、findより安全に使用できるため、より表現力が増します なので、特定のパターンに一致するディレクトリ階層内の特定のファイルのみを削除する場合は、次のような式でプレビューし、ファイルを削除します。

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

より安全なfind以外にもrmを学習して使用するのには多くの理由があります。そのため、findの使い方を学ぶために時間を割いてくれたら、後で感謝します。

15
aculich

はい:rootとして活動せず、行動する前に常によく考えます。

また、 https://launchpad.net/safe-rm のようなものも見てください。

15
Sven

これは、特にrmのコンテキストでの正規表現用の私の標準ですが、この場合は節約できます。

私は常に最初にecho foo*/[0-9]*{bar,baz}*を実行して、正規表現が何に一致するかを確認します。出力を取得したら、コマンドライン編集に戻り、echorm -rfに変更します。私決して、テストされていない正規表現でrm -rfを使用することはありません

11
MadHatter

この問題の解決策は、定期的なバックアップを取ることです。失うリスクを冒したくないものを作成するときはいつでも、それをバックアップしてください。定期的にバックアップするのが面倒すぎる場合は、プロセスを簡素化して、面倒にならないようにします。

たとえば、ソースコードで作業している場合は、gitなどのツールを使用してコードをミラーリングし、別のマシンで履歴を保持します。ドキュメントで作業する場合は、ドキュメントを別のマシンにrsyncsするスクリプトを用意してください。

10
David Schwartz

このリスクを減らす最善の方法は、ほとんどのGUIのように2段階の削除を行うことです。つまり、rmを、(同じボリューム上の)ゴミ箱ディレクトリに移動するものに置き換えます。次に、間違いに気付くのに十分な時間が経過した後、そのゴミを掃除します。

そのようなユーティリティの1つであるtrash-cliは、Unix StackExchangeで議論されています here

6
nnutter

ディレクトリを再帰的に削除するときは、コマンドのend-rと、該当する場合は-fを入れます。 rm /foo/bar -rf。このようにして、パス全体をまだ入力していないのに、誤ってEnterキーを早く押してしまった場合、コマンドは再帰的ではないため、おそらく無害です。 /fooの後にスラッシュを入力しようとしているときにEnterキーを押すと、rm /fooではなくrm -rf /fooと記述しました。

GNU coreutilsを使用しているシステムではうまく機能しますが、他の一部のUnixのユーティリティでは、このようなオプションを最後に配置できません。幸い、私はそのようなシステムをあまり使用していません。しばしば。

3
Wyzard

このようなタイプのミスを回避するための1つの重要な要素は、rootアカウントを使用してログインしないことです。通常の非特権ユーザーを使用してログインする場合は、コマンドごとにSudoを使用する必要があります。したがって、より注意する必要があります。

3
Khaled

globbing の使用は避けてください。 Bashでは、noglobを設定できます。しかし、再び、noglobが設定されていないシステムに移動すると、それを忘れて、あたかもそうであるかのように続行できます。

noclobberを設定して、mvcpがファイルを破壊しないようにします。

削除にはファイルブラウザを使用してください。一部のファイルブラウザは、ゴミ箱を提供します(たとえば、 Konqueror )。

グロビングを回避する別の方法は次のとおりです。コマンドラインでは、I echo filenamepattern >> xxxと入力します。次に、Vimまたはviでファイルを編集して、削除するファイルを確認し(filenmatesのファイル名パターン文字に注意してください)、次に%s/^/rm -f/を使用して各行を削除コマンドに変換します。ソースxxx。これにより、削除するすべてのファイルを確認してから削除します。

ファイルを「attic」ディレクトリまたはtarballに移動します。または、バージョン管理を使用します(私の前に言ったように)。

2
Andrej Panjkov

ZSHはrm -rf *を実行する前に(デフォルトで)私に尋ねます。

2
math

複雑かもしれませんが、SELinux内で roles を設定して、ユーザーがSudo su またはプレーンなsu)でrootになっても、ファイルを削除する機能を制限できます(ログインする必要があります)ファイルを削除するために直接rootとして)。 AppArmorを使用している場合、何か---(similar を実行している可能性があります。

もちろん、他の解決策は、バックアップがあることを確認することです。 :)

2
Rilindo

Unixベースのマシンでの私の削除プロセスは次のとおりです。

  • ターミナルウィンドウでls /path/to/intented/file_or_directoryと入力し、return(または必要に応じてTab)を押して、ファイルのリストを表示します。

すべてが良さそうなら、

  • up arrowキーをクリックして、ターミナル履歴からls /path/to/intented/file_or_directoryを再度表示します。

  • 必要に応じて、lsrmまたはrm -rまたはrm -rfに置き換えます。個人的には-fフラグを使用したくありません。

この検証プロセスにより、rmコマンドの早期実行も防止されます。これは、このプロセスを開始する前に、私に起こったことです。

2
Mohit Ranka

私はごみ箱の窓のアプローチが好きです。

私は通常、削除する必要があるすべてのものに対して「/ tmp/recyclebin」という名前のディレクトリを作成します。

mkdir /tmp/recyclebin

そして、決してrm -rfを使用しないでください、私は常に使用します:

mv target_folder /tmp/recyclebin

その後、スクリプトまたは手動でごみ箱を空にします。

1
Basil A

あなたが今新しい習慣を身につける気分でないなら、.bashrc/.profileは、何か愚かなことをしようとしているかどうかを確認するためのテストを追加するのに適した場所です。私はBash関数で、自分の1日を台無しにするかもしれないパターンをgrepできると考え、これを思いつきました。

alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of           
                        #the function so that we get the "raw" string.
myrm() {
    ARGV="$*"
    set +f #opposite of set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'another scary pattern'
    then
        echo "Do Not Operate Heavy Machinery while under the influence of this medication"
        return 1
    else
        /bin/rm $@
    fi
}

良い点は、それがBashだけであることです。

その形では明らかに一般的ではありませんが、可能性があると思うので、アイデアやコメントを投稿してください。

1
kln

私は通常-vフラグを使用して、何が削除されているかを確認し、^C少しでも疑問がある場合はすぐに。実際にはprevent悪いrmの方法ではありませんが、何かがうまくいかない場合のダメージを制限するのに役立ちます。

1
a3nm

同様の災害を防ぐために、他のコマンドのいくつかの安全エイリアスが見つかりました here

# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I'                    # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

大文字の-Iに注意してください。これは-iとは異なります。

4つ以上のファイルを削除する前に、または再帰的に削除するときに、一度プロンプトを出します。 -iよりも邪魔にならないが、ほとんどのミスに対する保護を提供する

1
Valentin Nemcev

chattrの外では、rootにそのようなコマンドを実行させるための安全策はあまりありません。これが、特権を実行するときに適切なグループと注意深いコマンドが重要な理由です。

次回;削除する予定のファイルを除外します-rm -rfから 'f'を省略するか、findを使用してxargs rmに渡します

1
thinice

残念なことに、カルマが不十分なため上記のコメントを残すことはできませんが、safe-rmは偶発的な大量削除の悪夢の万能薬ではないことを他の人に警告したかったのです。

以下はLinux Mint 17.1仮想マシンでテストされました(これらのコマンドに不慣れな人に警告:しないでください!実際、これらのコマンドに精通している人でも、壊滅的なデータ損失を避けるためにこれを行うべきではありません)。

テキスト版(要約):

$ cd /
$ Sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

画像バージョン(フル):

enter image description here

1
Miles Wolbe

私は自分のスクリプトを作成しただけで、あらゆる状況を警告して確認を求めることができ、それを改善する方法はあなた次第です

#!/bin/sh
# just Sudo mv /usr/bin/rm to /usr/bin/rm-original

path=${!#}

color_yel="\x1b[1;33m"
color_rst="\x1b[0m"

function get_yn() {
    read i
    if [ "$i" != "y" ]; then echo "aborted."; exit 1; fi
}

if [ -d ${path} ]; then
    echo -e "${color_yel}You are deleting a folder, it's potentially dangerous, are you sure (y/n) ?${col>
    get_yn
    /usr/bin/rm-original $@
fi

それを改善するためのさらなるアイデア:

  • 特定のフラグとパスを確認する
  • ゴミ箱フォルダに移動して削除
  • しばらくしてからゴミ箱に空の古いもの

したがって、単純なカスタマイズ可能なスクリプトを使用すると、特別な動作を実行し、追加のパッケージをインストールする必要がなくなります。

いくつかのbashの知識があれば、特定の種類のものだけをゴミ箱に入れることができます。

0

これは強力な防止策だと思います。シェルの拡張ショートカットは*です。

まず、rm -rf *またはrm -rf your/path/*Enterキーを入力しないでください。 (もちろん、rm -rf

次に、Alt-Shift-8(つまり、Alt-Shift-*)bashで「*」ワイルドカードを明示的に展開します。これにより、履歴をナビゲートするときに「rm -rf *」コマンドを再入力する必要がなくなります。

最後に、展開に適切なファイル/ディレクトリがあることを確認した後、Enterキーを押します。

できました。

0
Johnny Wong

これが自分のケースで誰かを助ける場合:

1. rmsafeを使用:

ファイルを「ゴミ箱」フォルダに移動し、単純なmvでいつでも元に戻すことができます。

$ rmsafe /path/to/important/files

ソース: https://github.com/pendashteh/rmsafe

2. safeを使用:

Safeを使用してrmのエイリアスを設定できます:

$ alias rm="safe rm"

rm /*を実行すると、これが返されます。

$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]

yは入力しないと思います!

ソース: https://github.com/pendashteh/safe

0
Alexar

また、安全策としてではなく、^ Cに到達する前に削除されたファイルを確認する方法として、locateデータベースを使用できます(もちろん、データベースがインストールされ、存続した場合のみrm

私はこれからそれについて学んだ ブログ投稿

0
Valentin Nemcev

へへ(期待外れでやや面白そう!)

$ cat /usr/local/bin/saferm

#! /bin/bash

/bin/ls -- "$@"

echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"

read userresponse

if [ "$userresponse" -eq "y" ]; then

  echo "Executing...."
  /bin/rm -- "$@"

fi

その後:

alias rm="/usr/local/bin/saferm"

現実的には、そのような操作をグロブで実行する前に、ルートとして実行しているか、「Sudo」を前に付加しているかなど、精神的な一時停止が必要です。同じグロブで「ls」を実行できます。しかし、精神的には、しばらく停止し、必要なものを入力したことを確認し、必要なものが実際に必要なものであることを確認するなどする必要があります。これは、最初の1年間で主にホットバーナーがストーブの何かが熱くなっているかもしれないとあなたに言う良い先生であるのと同じように、Unix SA。

そして、適切なバックアップがあることを確認してください!

0
cjc

ZFSを使用して、誤って削除されないようにするために必要なファイルを保存し、次のようなデーモンを用意します。

  • このファイルシステムのスナップショットを定期的に作成します
  • 古い/不要なスナップショットを削除します。

ファイルが削除されたり、上書きされたり、破損したりした場合でも、ファイルシステムを最後の適切なスナップショットのクローンにロールバックすれば完了です。

0
jlliagre

あまり答えではなくヒントです。私は常にrm (dir) -rfではなくrm -rf (dir)を実行します。つまり、可能な限り最後まで核に移行しないでください。

これは、Enterキーを滑らせたり叩いたりするなど、dir名がまだ有効な削除であるような方法でdir名を太った場合の状況を緩和するのに役立ちます。

0
Sirex