在没有可执行位的情况下启用 setuid 的目的是什么?

Ram*_*esh 4 setuid permissions

我正在尝试详细了解权限。我正在阅读有关setuid及其用途的信息。然而,这个特殊情况让我感到困惑。

我已经制作了一个小脚本,现在我已经为脚本设置了suid位,如下所示。

chmod u+s ramesh
Run Code Online (Sandbox Code Playgroud)

我看到权限设置如下。

-rwsrw-r--  1 ramesh ramesh   29 Sep 30 10:09 ramesh
Run Code Online (Sandbox Code Playgroud)

现在,我相信使用 setuid 任何用户都可以执行脚本。现在,我执行了命令

chmod u-x ramesh
Run Code Online (Sandbox Code Playgroud)

它给了我许可,

-rwSrw-r--  1 ramesh ramesh   29 Sep 30 10:09 ramesh
Run Code Online (Sandbox Code Playgroud)

现在,我明白S表示没有可执行位的 setuid。也就是说,没有人可以执行这个文件。

所以我的问题是,S位的设置有什么实际用途?我试图从设置这个位的示例角度来理解。

Mar*_*ich 5

现在,我相信使用 setuid 任何用户都可以执行脚本。

不完全的。要使每个用户都可以执行脚本,您只需要设置 a+rx 权限:

chmod a+rx script
Run Code Online (Sandbox Code Playgroud)

setuid 意味着脚本总是以所有者的权限执行,也就是说,如果您有以下二进制文件:

martin@dogmeat ~ % touch dangerous
martin@dogmeat ~ % sudo chown root:root dangerous 
martin@dogmeat ~ % sudo chmod a+rx,u+s dangerous 
martin@dogmeat ~ % ll dangerous 
-rwsrwxr-x 1 root root 0 Sep 30 17:23 dangerous*
Run Code Online (Sandbox Code Playgroud)

无论执行它的用户如何,此二进制文件将始终以 root 身份运行。显然,这是危险的,您必须非常小心使用 setuid,尤其是在编写 setuid 应用程序时。此外,您根本不应该在脚本上使用 setuid,因为它在 Linux 上本质上是不安全的。

现在,我明白 S 表示没有可执行位的 setuid。也就是说,没有人可以执行这个文件。

所以我的问题是,S位的设置有什么实际用途?我试图从设置这个位的示例角度来理解。

我认为没有实际目的,IMO 这只是权限位的可能组合。