我已经创建了用户,例如ronly
,现在我想授予他们对其他用户主目录中几个目录的只读访问权限,因此abc/,xyz/,pqr/
我将这个ronly
用户放在其他用户中,意味着没有为这个用户创建任何组,这意味着ronly
上述目录将是其他用户。现在一切都按预期工作,但唯一的问题是abc/,xyz,pqr/
有一些应该读取但不能执行的 shell 脚本ronly
。
具有这样的权限的 shell 脚本-rwxrw-r-- test.sh
意味着用户ronly
可以查看脚本但不能执行它们,这只适用于一种方式,就像执行./test.sh
这样的shell 脚本一样permission denied
,但sh test.sh
可以/bin/sh test.sh
允许ronly
执行脚本。
那么有什么方法可以限制它们执行 shell 脚本文件吗?
请不要建议使用 ACL 或 SElinux。由于某些限制,我不想启用此功能。
答案1
我们可以在脚本的开头进行验证。
userid=`id -u -n`
#echo "$userid" ;
ownuser=`ls -l ${abosolutepath}/${your_script.sh} | awk '{print $3}'`
#echo "$ownuser" ;
if [ ! "$userid" = "$ownuser" ]; then
echo permission denied
exit 1
fi
上述验证将检查执行此脚本的用户是否与拥有此脚本的用户相同。如果用户不匹配,则执行将终止。
我已经在我的环境中实现了这一点并且运行良好。
答案2
一般来说,这是不可能的。任何能够执行 shell 的用户也能够执行他们能读懂的任何 shell 脚本。shell 并不真正区分来自终端的命令和来自文件的命令。
因此您可能需要某种受限制的“shell”。原则上,任何程序都可以用作登录 shell。
答案3
无需涉及访问控制列表或者SELinux我发现的唯一方法是在脚本开头添加以下内容:
if [ "$USER" = "ronly" ]; then
echo 'Access denied'
exit 1
fi
这远非完美,因为:
- 用户
ronly
可以阅读脚本,因此他可以将内容复制到自己的脚本中家并执行它。 - 任何用户都可以自由设置他们的 $USER 环境变量,例如将 USER 变量设置为
abc
并执行脚本,这将绕过限制。
如果你这样做只是为了避免“偶然”执行那么它就可以工作,但如果你的目的是真正禁止执行那么它就不行。