如何使脚本只能访问某些文件?

如何使脚本只能访问某些文件?

假设我有一个脚本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"

相关内容