/bin/rm -f * 実行を無効にするには?

/bin/rm -f * 実行を無効にするには?

/bin/rm -f *サブディレクトリを一覧表示し、現在のディレクトリで実行された回数を覚えていません。この問題を防ぐのに役立つ提案を提供できる人はいますか?実行しようとしたときにシステムに危険を警告させるにはどうすればよいですか/bin/rm -f *

答え1

zshデフォルトでは、コマンドラインからフルワードで呼び出されるコマンドを実行しようとすると、確認メッセージが表示されますrm*この機能はから継承されますが、デフォルトでは有効ではありません)。tcshtcsh

$ rm -rf *
zsh: sure you want to delete all the files in / [yn]?

Bashを使用する必要がある場合は、最新バージョンを使用してください。 and Trapを使用すると、同様のことがbashできます。extdebugDEBUG

shopt -s extdebug
check_for_rm_star() {
  case $1 in
    (rm*[\ /]"* "* | rm*[\ /]\*)
      read -p "check_for_rm_star: Are you sure? " -n1 answer < /dev/tty > /dev/tty
      echo > /dev/tty
      [[ $answer == [yY] ]]
  esac
}
trap 'check_for_rm_star "$BASH_COMMAND"' DEBUG

rm *これは、andの最も一般的なケースでは機能しますが、rm "*"orでは機能しない単純なアプローチですが、/bin/rm *アイデア: $(rm *)を得ることができます。理想的には、$BASH_COMMANDシェルが行うように解析し、最初の引数がrmor に拡張されていることを確認し、引用*/rm符なしで引数が渡されたことを確認する必要があります*が、実際には防弾的な方法では実行できません。

答え2

rm1つの可能性は、あまり破壊的でないコマンドにマップされるシェルエイリアスを作成することです。たとえば、

alias rm='trash'  # from the package trash-cli

これにより、ファイルは削除されませんが、回復するためにファイルをごみ箱に入れます。ただし、これによりコマンドの意味が変わります(たとえば、rmディレクトリを使用せずにディレクトリ全体を削除できます)。-rまた、フルパスを使用すると役に立ちません。

もう1つの可能性は、1時間に1回など、定期的なバックアップを設定することです。これにより、ファイルを削除して後で回復することができます。

答え3

唯一の方法は、rm自体を交換することです。

安全なrmを提供するように設計されたrm用のラッパースクリプトは、次の場所にあります。発射台。このページでは:

Safe-rmは、絶対に削除してはいけない設定可能なファイルやディレクトリのブラックリストと比較して指定されたパラメータを確認するラッパーで、/bin/rmを置き換えて重要なファイルが誤って削除されるのを防ぐように設計されたセキュリティツールです。

私が見た唯一の問題は、「危険な」rmの例がフルパスで実行されることです/bin/rm。したがって、このラッパースクリプトを$ PATHの古いディレクトリに配置することはできません。rmを実行すると、それを見つけて、以下のようにフルパス/ bin / rmを入力して、ラップされていない「通常の」rmを取得できません。上記のようにしてください。

答え4

簡単な解決策は、追加してalias rm="rm -i"から削除するたびに確実であるかどうかを尋ねることです。しかし、先生の一人が指摘したように、これはあなたが使用しているUNIXシステムが安全で暖かい場所であると思うように欺くことができ、これは誤って実行するよりも危険です。rm *

関連情報