スクリプトがあるとしましょう。remove.sh
rm -r "$1"
このスクリプトを使用して、フォルダ内のコンテンツのみを削除し、他の場所では削除しないでください~/Desktop/A
。
したがって、実行すると./remove.sh ~/Desktop/A/file1
成功する必要がありますが、実行すると./remove.sh ~/.bashrc
失敗する必要があります。
この質問の目的は、任意のスクリプトが私のホームディレクトリから何かを削除するなど、危険なタスクを実行するのを防ぐことです。
答え1
これは、UNIXファイル権限が機能する方法ではありません。権限は個々のプログラムではなくユーザー(またはユーザーグループ)に付与されます(そうでない場合は、制限ではなくプログラムを複製するだけでよいため、これは意味があります)。
したがって、プログラムを実行できるように新しいユーザーを作成することで、実行したい操作を回避できます。そのユーザーにフォルダに対する権限(既存のUNIX所有者/グループ権限またはACLを使用)を付与します(他の人は少ない)。 。
しかし正直に言って、逆に問題を解決しているのです。他のユーザーでスクリプトを起動しても、そのユーザーでスクリプトを起動しないことで禁止を再度回避できます。
特定のSELinuxコンテキストなしでリンク解除を無効にするためにSELinuxモジュールを作成できますが、上記と同じ理由で複雑で簡単にバイパスできます。
したがって、ユーザーがプログラムを起動すると、「...を無効にします。」は機能しません。持つ物を削除する権限です。解決しようとしている問題が何であれ、まったく異なるアーキテクチャを検討したいかもしれません!
答え2
次のように設定できます。
#!/bin/bash
rm_selectively()
{
local path="$1"
local st=1
if [[ $path == ~/Desktop/A ]]; then
rm -r "$path"
st=$?
else
printf '%s\n' "You are trying to remove something else"
fi
return $st
}
main()
{
if (($# < 1)); then
printf '%s\n' "You need to provide a path"
else
rm_selectively "$1"
fi
}
main "$1"
実行可能にして(.sh
スクリプトに何も追加しないでください)、実行してください。
答え3
検証されたパスパラメータが次に含まれる場合にのみ実行されるように、スクリプトにテストを含めることができます~/desktop/A
。
realpath "$1" | grep -q '^'"$HOME"'/Desktop/A/' || exit 1
rm -r "$1"