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