如何创建仅具有读取权限而没有执行和写入权限的 Linux 用户?

如何创建仅具有读取权限而没有执行和写入权限的 Linux 用户?

我已经创建了用户,例如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

这远非完美,因为:

  1. 用户ronly可以阅读脚本,因此他可以将内容复制到自己的脚本中并执行它。
  2. 任何用户都可以自由设置他们的 $USER 环境变量,例如将 USER 变量设置为abc并执行脚本,这将绕过限制。

如果你这样做只是为了避免“偶然”执行那么它就可以工作,但如果你的目的是真正禁止执行那么它就不行。

相关内容