为什么获取文件不需要执行权限?

为什么获取文件不需要执行权限?

有人问关于 Ask Ubuntu 的一个问题permission denied当他们进入 Bash shell 时为什么会出现这样的情况

/etc/profile

我知道这是因为该文件没有执行权限。即使 root 也无法执行它(sudo /path/to/file/with/no/execute/bits失败并出现无信息错误sudo /path/to...: command not found)。我也知道根进入一个没有执行位的目录,因此绝对禁止执行不可执行的文件显得很特殊。在聊天中,Eliah Kagan 认为 root 无法执行非可执行文件的原因是为了保护 root(推测是由于意外执行危险代码)。

我简单地想知道为什么有人想要执行它/etc/profile,并认为如果有人确实想要执行它,他们可能实际上想要source它(因为它是一个设置环境和 shell 变量的配置文件)。然后我意识到source任何常规文件都不需要执行权限。而是source在当前shell中执行该文件!该文件可以包含任何命令,并且. file将直接执行它。

如果限制执行权限是为了防止意外执行潜在危险的代码,为什么可以使用该source命令执行不可执行的文件?

答案1

我不认为执行不可执行文件会失败故意以防止意外执行有潜在危险的代码。它只是 语义的一部分:如果“文件、脚本或 ELF 解释器的执行权限被拒绝”,execve则会失败。 EACCES(我引用的是Linux 联机execve帮助页POSIX类似的话:“对新进程映像文件的路径前缀中列出的目录的搜索权限被拒绝,或者新进程映像文件拒绝执行权限。”)Unix/Linux 从来没有特别关心防止用户自吹自擂离开。

我认为这个解释相当平淡:执行和采购的规范是不同的。直接执行要求内核执行给定的命令,并强制执行执行权限。获取文件只是指定为读取并执行它;实际上联机bash帮助页明确指出“搜索的文件PATH不必是可执行的。”POSIX 说“然而,与普通命令搜索不同的是,由实用程序不必是可执行的。” (.相当于source。)

请注意,即使二进制文件不可执行,您也可以使用类似于获取它们的技术来执行它们:

$ cp /bin/ls .
$ chmod 644 ls
$ /lib64/ld-2.26.so ./ls

善行难陀观点比较和 POSIXbash很有趣。在非 POSIX 模式下,如果给定一个没有路径的参数,它会尝试在 中查找它,如果没有找到它,则在当前目录中查找;在 POSIX 模式下则不然,因为 POSIX 禁止这样做:source.sourcePATH

一些较旧的实现在当前目录中搜索文件,即使值小路不允许它。 POSIX.1-2008 的本卷中省略了此行为,因为担心用户可能会试图通过离开来避免对特洛伊木马的易感性在......之外小路

不过,这在当前的讨论中并没有真正改变太多,因为带有路径的参数将被source.在任何情况下处理。 (实际上,您应该始终使用路径,即使只是相对路径,作为source参数,以避免当您尝试source某些事情时出现意外在你的PATH。尝试创建一个名为的文件test并使用source testin获取该文件bash,看看我的意思。)

相关内容