权限的用途,例如0111或0333


17

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


1
您有这种设置的例子吗?我想你是对的。您无法执行无法阅读的内容。这些组合仅是理论上在0000和0777之间的许可范围内。请注意,应添加前导0以显示数字的八进制基数。
ikrabbe 2015年

6
除非它是一个脚本(例如,shell脚本),否则实际上不需要读取权限即可执行命令。“正常”可执行文件-例如 su,bash或vi-只需设置可执行位,以允许用户运行它。无法读取,无法复制的文件。因此,通过不允许用户复制重要的安全命令(如su),可以防止他自己制作该命令的副本-并尝试将其反汇编。* BSD有几个具有执行但没有读取权限的命令。
Baard Kopperud

Answers:


25

我玩过它,显然,执行权限并不意味着具有读取权限。二进制文件可以是可执行的,而不是可读的:

$ 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

我不能执行脚本,除非它们在以下位置都具有读取和执行权限位:

$ 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

4
这是正确的,因为第二个示例使用#!因为它缺少ELF头而启动,因此要求文件可读,以猜测使用哪个可执行文件。这是常见的情况,在这种情况下,您希望保护文件内容不被复制到其他位置。许可证管理器是常见的示例,您将在其中看到此信息。
hspaans 2015年

1
请注意,您仍然可以读取仅可执行的二进制文件:unix.stackexchange.com/a/34294
小太郎

6
@hspaans:shebang由内核处理,内核不关心权限之类的古怪小事情。需要读取访问权限的是外壳程序(或解释程序)。内核运行(例如)/bin/bash hw.sh,然后bash尝试打开hw.sh以进行读取(并失败)。
凯文

2
我非常希望内核确实关心权限。没有别的。@Kevin帖子中令人恐惧的一句话意味着,内核仅需要执行权限即可执行文件,而不管它们是否使用了shebang。
EmilJeřábek在2015年

2
@EmilJeřábek内核在决定应用程序进程可以做什么时关心权限。但是由于是实现权限的组件,因此它也可以在内部忽略它们。因此,它可以在确定如何执行解释的文件时读取shebang行,或将仅执行的二进制文件的内容读取到内存中。
Barmar

16

这对于目录是有意义的,例如,如果将(可执行文件)可执行文件保留在特定目录中,然后允许用户调用这些文件而看不到目录内容(但在通知它们后知道有特定文件!)。333与111相比,允许在这些目录中写入文件或从中删除文件,而看不到目录的内容。


5
在我的Uni校区,这些权限被用于将作业拖放到目录中,而学生却看不到其他任何作业。讲师是老傻子。
DarkHeart

@DarkHeart有趣。我希望您必须在文件名中添加一个随机成分,因为否则,如果这不鼓励尝试从您的同学那里进行复制,那么我不知道这是什么。
PSkocik

5

显然,并非所有组合都是有用的,但是要采用您特别提到的组合……实际上,您不需要read执行文件的execute权限(只有权限),除非所涉及的文件是脚本(例如,shell脚本) (.sh),perl脚本(.pl)等)。普通的二进制文件只能在execute获得许可的情况下执行。在* BSD-systmes上,多个可执行文件在execute没有许可的情况下给出了许可read,尤其是在“安全性重要”命令上-例如su

那么,为什么不给予用户read-permission(仅execute授予-permiton)呢?因为文件不能被用户读取,也不能被该用户复制!删除read权限会阻止用户制作自己的可执行文件“个人”副本-他们以后可能会滥用(例如get SUID=root on)。

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

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


“防止甚至owner只是删除文件也是一个好主意。” —删除文件不需要任何类型的权限(读取,写入或执行)。
Celada

只读可执行文件可以使用,例如,如果可执行文件嵌入了一个数据库密码,该密码在运行时将用于连接到数据库并执行其工作,但不一定要透露密码。
Celada

@Celada,这是一个古老的问题,但是通过查找内存区域中的偏移量/proc/${PID}/maps然后从中读取内存的相关部分,这样的方法难道不容易发生内存转储/proc/${PID}/mem吗?还是在执行期间限制可执行文件的权限还限制了其在内存中相关部分的读取权限?(IMO似乎不太可能。)
Spencer D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.