0111 或 0333 等权限的用途

tro*_*813 17 permissions chmod

Linux权限如111或333(即用户可以执行,但不能读取文件)的目的是什么,如果执行能力不自动意味着具有读取能力?

PSk*_*cik 25

我玩过它,显然,exec 权限并不意味着读取权限。二进制文件可以在不可读的情况下执行:

$ echo 'int main(){ puts("hello world"); }' > hw.c
$ make hw
$ ./hw
hello world
$ chmod 111 hw
$ ./hw 
hello world
$ cat hw
/bin/cat: hw: Permission denied
Run Code Online (Sandbox Code Playgroud)

我无法执行脚本,除非它们同时具有 read 和 exec 权限位:

$ cat > hw.sh
#!/bin/bash
echo hello world from bash
^D
$ chmod +x ./hw.sh
$ ./hw.sh 
hello world from bash
$ chmod 111 ./hw.sh
$ ./hw.sh
/bin/bash: ./hw.sh: Permission denied
Run Code Online (Sandbox Code Playgroud)

  • @hspaans:shebang 由内核处理,内核不关心权限等古怪的小事情。它是需要读取访问权限的 *shell*(或解释器)。内核运行(比如)`/bin/bash hw.sh`,然后bash 尝试打开`hw.sh` 进行读取(但失败)。 (7认同)
  • 这是正确的,因为第二个示例使用了 #! 开始,因为它错过了 ELF 标头,因此需要文件可读,以便它猜测要使用哪个可执行文件。这是您想要保护文件内容不被复制到其他位置的常见情况。许可证管理器是您会看到这一点的常见示例。 (4认同)
  • @EmilJeřábek 在决定应用程序进程可以做什么时,内核关心权限。但由于它是实现权限的组件,因此它也可以在内部忽略它们。因此,它可以在确定如何执行解释文件时读取 shebang 行,或者将只执行二进制文件的内容读入内存。 (3认同)
  • 请注意,您仍然可以读取仅可执行的二进制文件:http://unix.stackexchange.com/a/34294 (2认同)
  • 我非常希望内核*确实*关心权限。其他什么都不做。@Kevin 帖子中可怕的一句话意味着内核只需要执行权限来执行文件,而不管它们是否使用shebang。 (2认同)

小智 16

这对于目录是有意义的,例如,如果您将(秘密)可执行文件保存在特定目录中,然后允许用户在无法看到目录内容的情况下调用这些文件(但在您通知他们后知道特定文件在那里!)。与 111 相比,333 允许向/从这些目录写入/删除文件,而无法看到目录的内容。

  • 在我的大学,这些权限用于将作业放入目录中,而学生不会看到其他人的工作。讲师是个老家伙。 (5认同)

Baa*_*rud 5

显然,并非所有组合都那么有用,但以您特别提到的组合为例……您实际上不需要read执行文件的execute权限——只需要权限——除非有问题的文件是脚本(例如 shell-script) ( .sh)、perl-script ( .pl) 等)。普通的二进制文件只需要execute许可就可以执行。在 *BSD-systmes 上,几个可执行文件在execute未经许可的情况下给予许可read,尤其是在“安全重要”命令上——例如su.

那么为什么不给用户read-permission (和只是execute-permisson)?因为一个用户无法读取的文件,该用户也无法复制!删除read权限,可以防止用户制作他们自己的可执行文件的“个人”副本——他们以后可能会滥用(例如 get SUID=root on)。

并且没有write权限,可以防止文件被意外删除。

提醒你,不给也不read-nor write-permission车主是有点少见,但有时也可能是一个好主意,以防止甚至owner从刚删除的文件。当然owner——更不用说root——可能总是绕过这些措施,如果不是以其他方式,那么只需通过chmod对文件的许可。