目前我正在我的树莓派上玩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 标志来运行它们。