有人在 Ask Ubuntu 上问了一个问题,关于为什么他们permission denied
在进入 Bash shell 时会得到
/etc/profile
我知道这是因为该文件没有执行权限。甚至 root 也无法执行它(sudo /path/to/file/with/no/execute/bits
失败并出现无意义的错误sudo /path/to...: command not found
)。我也知道root可以进入没有执行位的目录,所以绝对禁止执行不可执行的文件似乎很特别。在聊天中,Eliah Kagan 认为 root 无法执行不可执行文件的原因是为了保护 root(可能是为了防止意外执行危险代码)。
我简要地想知道为什么有人想要执行/etc/profile
并认为如果有人确实想要执行它,他们可能真的想要source
它(因为它是一个设置环境和 shell 变量的配置文件)。source
然后我意识到任何常规文件都不需要执行权限。但是source
在当前shell中执行文件!该文件可以包含任何命令,. file
并将继续执行它。
如果限制执行权限以防止意外执行有潜在危险的代码,为什么可以使用source
命令执行不可执行的文件?
我不认为执行不可执行文件会故意失败以防止意外执行潜在危险的代码。它只是语义的一部分
execve
:EACCES
如果“文件或脚本或 ELF 解释器的执行权限被拒绝”,它会失败。(我引用了 Linuxexecve
联机帮助页。POSIX说了类似的话:“新进程映像文件的路径前缀中列出的目录的搜索权限被拒绝,或者新进程映像文件拒绝执行权限。”)Unix/Linux 从来没有特别关注防止用户把自己的脚吹掉。我认为这个解释比较平淡:执行和采购的规范是不同的。直接执行要求内核执行给定的命令,并强制执行权限。获取文件只是指定为读取并执行它;事实上,
bash
手册页明确指出“搜索的文件PATH
不需要是可执行的”。POSIX 说: “与普通的命令搜索不同,点实用程序搜索的文件不一定是可执行的。” (.
相当于source
。)请注意,即使它们不可执行,您也可以执行二进制文件,使用类似于采购它们的技术:
Kusalananda关于比较's和 POSIX的观点很有趣。在非 POSIX 模式下,如果给定一个没有路径的参数,它会尝试在 中找到它,如果没有找到,则在当前目录中查找;在 POSIX 模式下它不会,因为 POSIX 禁止这样做:
bash
source
.
source
PATH
不过,这在手头的讨论中并没有太大变化,因为带有路径的参数将由
source
或.
在任何情况下处理。(实际上,即使只是相对路径,您也应该始终使用路径作为参数,以source
避免在尝试使用.source
PATH
test
source test
bash