「rm -rf ~」が誤って実行されるのを防ぐ方法は?

「rm -rf ~」が誤って実行されるのを防ぐ方法は?

このコマンドが端末で誤って実行されるのを完全に防ぐ方法はありますか?たとえば、bashにはエイリアスがあることがわかります。使用できる方法はありますか?

答え1

rmはい。混乱を避ける方法があります。ただし、このように完全なコマンドを作成するよりも、rmUnixシステムを責任を持って使用する方法を学ぶ方が良いでしょう。

私のアドバイス:

  • 危険なコマンド(rm、、ddなど)shredを処理するevalときは、特に注意してください。

  • タイプミスがなかったという確信がなければ、何もしないでください。

  • 指定されたコマンドを完全に理解していない場合は、そのコマンドを実行しないでください。続行する前にマニュアルをお読みください。

  • バックアップしてください。そしてバックアップをバックアップしてください。


つまり、次のようにすることができます。

alias rm='rm -i'
rm() { command rm -i "${@}"; }

そのオプションを渡すことは保護されませんが、-f単純な場合には機能します。

$ rm file
rm: remove regular file 'file'? y

あるいは、より複雑なラッパーを作成することもできます。

このアプローチの最大の問題は、これらの非標準的な動作に慣れることができるということです。これは、このクラス名/関数/ラッパーを持たないシステムで作業する必要がある場合に非常に危険です。

答え2

要求に応じて、このラッパー機能はユーザーが特定の種類のエラーを犯すのを防ぎます。

function rm {
  if [ "$#" -eq 2 ] && [ "$1" = "-rf" ] && [ "$2" = "$HOME" ]
  then
    echo Avoiding a dangerous command...
    return
  else
    command rm "$@"
  fi
}

これは、$ HOMEが設定されている場合(そうでない場合はユーザーのホームディレクトリ)、bashがそれをrm -rf ~置き換えるためです。rm -rf $HOME

これはいいえただし、多くのエラーを防ぐことができます。パラメータを繰り返すようにテストを拡張し、各パラメータがのサブセットであるか、$HOME注意すべき項目であるかを確認できます。

これは、ユーザーが他のバリアントを実行rm -rf ./*したり実行したり\rm -rf ~するのを防ぎません。sudo rm -rf ~

答え3

利用可能なヒント:削除読む保護するディレクトリに対する権限。これにより、特定のサブファイルやディレクトリを提供しないコマンドで実行する必要があるディレクトリの内容を明示的または暗黙的に一覧表示することを防ぎます。サブ名を指定する場合は、ディレクトリナビゲーション権限(flag execute)のみが必要なため、保護されたディレクトリの下のすべてのエントリにアクセスできます。

クイックデモ:

# Create the directory, remove its 'read' flag
**$ mkdir protected && chmod -r protected && ls -ald protected
d-wx--x--x 2 me me 4096 Dec  7 21:58 protected

# You cannot list contents since you cannot read it
**$ ls protected
ls: cannot open directory 'protected': Permission denied

# You can create files in it since you have write permission
**$ touch protected/{1..3}

# You can list specific directories entries
**$ ls -al protected/1
-rw-r--r-- 1 me me 0 Dec  7 21:59 protected/1

# You can also create subdirectories
**$ mkdir protected/subdir

# ... and create files in them
**$ touch protected/subdir/{1..3}

# ... do wilcard listing of these subdirectories
**$ ls -al protected/subdir
total 8
drwxr-xr-x 2 me me 4096 Dec  7 21:59 .
d-wx--x--x 3 me me 4096 Dec  7 21:59 ..
-rw-r--r-- 1 me me    0 Dec  7 21:59 1
-rw-r--r-- 1 me me    0 Dec  7 21:59 2
-rw-r--r-- 1 me me    0 Dec  7 21:59 3

# You can erase files, along as you specify them explicitly
**$ rm protected/{1..3}

# You cannot do a blanket erase, since it would require reading the directory
**$ rm -rf protected
rm: cannot remove 'protected': Permission denied

# ... but that works on its subdirectories
**$ rm -rf protected/subdir

# You can still remove the directory once it is empty
**$ rmdir protected

ただし、読み取り権限を持つユーティリティ(ファイルエクスプローラなど)が多い可能性があるため、このソリューションがホームディレクトリで機能するかどうかは疑問です。

関連情報