为什么只有执行权限就无法执行脚本?

为什么只有执行权限就无法执行脚本?

目前我正在我的树莓派上玩linux,我试图了解权限系统是如何工作的。

我创建了一组两个用户,其中一个在他自己的文档文件夹中创建了一个 python 脚本,权限为:-rwx--x---

另一个组成员应该使用命令 python hello.py 执行该文件,但他说权限被拒绝。

唯一的方法是授予该组阅读权限,因此:-rwxr-x---

为什么执行权限不够,无法执行python脚本?

答案1

执行权限足以让内核执行该文件。

如果文件以 开头#!,那么它将看到它是一个脚本,解析该行以找出解释器的路径和可选参数,然后使用该可选参数和文件路径作为参数执行该解释器。

例如,如果文件开头为:

#! /usr/bin/python -E

内核将 更改execve("/path/to/the-script", ["the-script", "arg"], [envs])execve("/usr/bin/python", ["/usr/bin/python", "-E", "/path/to/the-script", "arg"], [envs]).

如果没有执行权限,它永远不会走到这一步。

此时,重要的是解释器的执行权限。如果它是可执行文件,那么它就可以正常工作。

然而,稍后,/usr/bin/python会想打开它/path/to/the-script来阅读和解释其中的代码。为此,它将需要该文件的读取权限。除非自上次以来它已经更改了 euid(例如,如果文件/usr/bin/python具有 suid/sgid 位),否则如果您之前没有读取权限,那么您仍然没有它。

因此,如果您只有执行权限,则可以正常执行脚本。只是如果解释器需要打开它来读取其内容,它就会失败(并且您会看到错误消息来自解释器,而不是您尝试运行该脚本的 shell)。在这样的脚本中:

#! /bin/echo Here goes

您会发现没有读取权限并不重要,因为echo没有尝试打开文件进行读取。

答案2

脚本不需要“x”权限即可运行。从内核的角度来看,它们是简单的文本文件,并且不是它们运行的​​,而是它们的解释器。如果您运行 python 脚本,您将启动 python 二进制文件,而不是 Something.py 。

但是脚本上需要 r 标志,因为解释器必须能够读取脚本并执行它。

大多数解释器不会执行没有可执行标志的脚本。尽管他们可以,但这是一个安全预防措施公约。

因此,对于脚本,您需要 r 和 x 标志来运行它们。

相关内容