我正在阅读 chmod 及其八进制模式。我看到那1
只是执行。仅执行权限的有效用例是什么?要执行文件,通常需要读取和执行权限。
$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo
答案1
外壳脚本需要读权限才能执行,但是二进制文件不要:
$ cat hello.cpp
#include<iostream>
int main() {
std::cout << "Hello, world!" << std::endl;
return 0;
}
$ g++ -o hello hello.cpp
$ chmod 100 hello
$ ./hello
Hello, world!
$ file hello
hello: executable, regular file, no read permission
显示文件的内容和执行它们是两件不同的事情。对于 shell 脚本,这些事情是相关的,因为它们是通过将它们“读”到新的 shell(或当前的 shell)中来“执行”的,如果您能原谅这种简化的话。这就是为什么你需要能够阅读它们。二进制文件不使用该机制。
对于目录,执行权限略有不同;这意味着你可以对文件做一些事情之内该目录(例如读取或执行它们)。假设您有一组工具,/tools
您希望人们能够使用它们,但前提是他们了解这些工具。chmod 711 /tools
。然后可执行的东西/tools
可以显式运行(例如/tools/mytool
),但ls /tools/
会被拒绝。类似地,/private-docs
当且仅当文件名已知时,才可以存储可以读取的文档。
答案2
在 Gentoo 上,setuid(设置为以其所有者而不是调用者的权限运行)的可执行程序将被拒绝读取访问(模式 4711)。这是为了增加一层保护,防止利用错误来帮助权限升级。
如果非特权攻击者可以读取 setuid 文件,并且知道允许返回 libc 风格的攻击,他们也许能够使用文件的内容来预测在调用程序时某些有用的函数或库可能被放置在内存中的位置。
现代系统通常包括更有效的附加保护,例如ASLR,但 32 位平台中存在的限制可能会使它们更容易被利用。
答案3
看起来“仅执行”的值对于文件来说没有多大用处,但它可以用来防止人们读取目录的内容。
$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
答案4
您需要具有读取和执行权限才能执行脚本。读取脚本的内容才能使其执行,因此您需要能够read and execute
。否则,没有它就无法运行脚本。
仅执行权限的有效用例是什么?
安全。有些人可能想要保护他们的文件并阻止其他人执行或使用它们。