我正在阅读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
我正在阅读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
Answers:
Shell脚本要求执行读取权限,但二进制文件则不需要:
$ 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
并且仅当已知文件名时才可以在其中读取文档。
cd
。
stdio.h
。我建议将其删除。
ls
完成制表符而使维护工作变得烦人,并且几乎没有提供任何实际的安全益处。攻击者可能会对大多数文件感兴趣的地方还是位于已知的标准位置,或者可以从其他文件中的数据间接发现它们的位置(否则合法使用这些文件的程序将如何知道在哪里找到它们?)。
在Gentoo上,拒绝setuid(设置为使用其所有者而不是其调用者的权限运行)的可执行程序的读取访问权限(模式4711)。这是为防止利用漏洞增加一层保护,以帮助特权升级。
如果没有特权的攻击者可以读取setuid文件,并且知道允许返回libc式攻击的错误,则他们可以使用文件的内容来预测某些有用的函数或库可能在哪里程序调用时将其放置在内存中。
现代系统通常包括更有效的附加保护,例如ASLR,但是32位平台中存在的限制可能会使它们更易于利用。
看起来“仅执行”的值对文件没有多大用处,但可用于防止文件读取目录的内容。
$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
您需要具有读取和执行权限才能执行脚本。读取脚本的内容是使脚本能够执行的原因,因此您需要能够执行脚本read and execute
。否则,没有脚本就无法运行脚本。
仅执行权限的有效用例是什么?
安全。有些人可能想要保护自己的文件,并阻止其他人执行或使用它们。
chmod 000
除了以外,其他任何人都不会考虑许可root
。有时,您不必为了保护而走得太远-这取决于用户的意图。为了让我们说“重新chmod”文件回到可读和可写的权限,您必须通过做到这一点root
。如果您无法访问root
,那么将非常困难。
/tools
,希望人们能够使用,但前提是他们了解他们。 chmod 711 /tools
。然后可执行的东西中 /tools
可以明确地运行,但ls /tools/
将被拒绝。