スクリプトが特定のファイルにのみアクセスできるようにするにはどうすればよいですか?

スクリプトが特定のファイルにのみアクセスできるようにするにはどうすればよいですか?

スクリプトがあるとしましょう。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"

関連情報