chmod 1,2 和 4,它们到底起什么作用?

chmod 1,2 和 4,它们到底起什么作用?

我想知道仅具有读取、仅具有写入或仅具有执行权限以及这是什么意思。

如果我只有写权限,是否意味着我可以附加或替换文件的内容,但不能读取当前内容?

更令人困惑的是:如果我有只读权限,为什么我不能直接复制文件并执行它呢?为什么读取权限不会自动授予执行权限?如果他们可以直接将文件复制粘贴到其他地方并在那里执行,那么不授予执行权限有什么用呢?

如果他们只有执行权限,那意味着什么?执行文件难道不需要你看到它吗?

我的最后一个问题是:如果授予了执行权限,那会有什么不同?执行 .txt 文件是没有意义的。在 Windows 上,例如有 .exe、.bats 等等。在 Unix 系统上,我只知道 .sh。是否有一定数量的扩展名定义可执行文件?如果是现在,我如何识别一个?

答案1

在 UNIX 中,chmod 1 = 执行,读取为 4,写入为 2。

任何内容都可以被 chmod 为 1,然后当前 shell 将尝试运行它,您可以将其名称作为命令输入。文件开头有一些文件“魔法”,如果前几个字符是“#!”(shebang),则该行的下一部分列出了要运行的实际可执行文件的路径以及要传递给 shell 的任何选项。文本脚本被传递给该可执行二进制文件以读取文件并有效运行它。

您问,执行是否需要读取,是的,但这取决于二进制程序(例如 korn shell)的判断,以向您显示文件。通常,它就像 DRM 一样,程序会尊重它以检查您对文件的权限。我在 shell 脚本中设置了例程,并将它们标记为 --x 仅可执行,它可以运行,但基本上不能读取(我认为一些较旧的 UNIX 版本对此有麻烦,就像 /tmp 上的特殊目录粘性权限一样,但这是另一个话题)。

如果脚本仅标记为 4,即“已读”,则授予您将文件输出到终端的权限。是的,您可以执行它,具体取决于您将行传递给 shell 解释器的方式,许多 shell 都有一个命令行选项,可以告诉它从给定文件中读取行并像脚本一样运行它们。

对于最后一种情况,chmod 2 是写权限。如果您仅授予该权限,那么您只能附加或销毁文件的内容。您无法根据文件的权限销毁/取消链接/删除文件,控制文件是否存在的行位于目录内(我也喜欢将其视为文件)。

我不得不说 chmod 2 在文件上不是很有用,但是在目录上你可以创建一个安全的“投递箱”,以便其他人(通常是班级里的学生)向你发送文件,并且你希望他们不会覆盖其他学生的文件名。

手册页“man chmod”中应该有一些帮助,希望您有自己的类 UNIX 系统,可以在自己的主目录中尝试操作。许多奇怪的情况(如执行)实际上只需要另一个用户 ID 或朋友向您展示各种权限的结果。

答案2

这是什么意思

安全权限八进制值允许在对象上明确设置相关权限。您可以使用在对象上设置的这些权限来明确设置chmod。有关此内容的更多详细信息,请参阅下面参考表。


我拥有的

例如,如果你想允许某人执行一个文件来运行一些逻辑,并且按照舍邦如果不能读懂内容或看懂逻辑,那么灵活性就存在了。


按自己的需要设定

您可以根据自己的个人需要设置安全权限,因此如果某些安全配置对您来说没有意义,那么您根本就不需要使用它。


数字权限

chmod 数字格式最多接受 4 位八进制数字。最右边的三位数字分别表示文件所有者、组和其他用户的权限。当给出 4 位数字时,可选的前导数字指定特殊的setuidsetgidsticky标志。

最右边三位数字的每一位代表一个二进制值,它的位分别控制读取、写入和执行,其中1表示允许,0表示不允许。这类似于八进制表示法,但以十进制数表示。

# Permission              rwx Binary
7 read, write and execute rwx 111
6 read and write          rw- 110
5 read and execute        r-x 101
4 read only               r-- 100
3 write and execute       -wx 011
2 write only              -w- 010
1 execute only            --x 001
0 none                    --- 000

例如,754将允许:

  • 读取、写入和执行,因为的OWNER二进制值为,表示所有位都处于打开状态。7111

  • 的读取和执行,因为的GROUP二进制值为,表示读取和执行已打开但写入已关闭。5101

  • 只读,因为的EVERYONE ELSE二进制值为,意味着只读。4100

答案3

正如其他人所指出的,文件权限是一个位掩码。系统不会特意阻止使用奇怪或无用的组合:无用并不意味着有害。

如果我只有写权限,是否意味着我可以附加或替换文件的内容,但不能读取当前内容?

是的。

如果我只读,为什么我不能直接复制文件然后执行它?

可以,但有例外。复制“特权”文件(具有 setuid/setgid 位或 Linux 文件功能的文件)不会复制这些属性。您还需要一个可以将其复制到的位置,并且可能有一个系统的 /home 分区不允许从中执行文件。

无需复制,只需手动调用相应的解释器即可完成相同的操作。例如,sh /path/to/script即使 shell 脚本不可执行,也可以通过 运行它们。Linux 上的二进制文件也有一个解释器,/lib/ld-linux.so

如果他们只有执行权限,那意味着什么?执行文件难道不需要你看到它吗?

确实如此 - 但这是经过检查的setuid 位已处理。如果您正在执行 setuid 程序,它将具有所有者的权限,因此只有所有者才需要 +r。

对于目录,+x 具有不同的含义(它允许您遍历文件夹,即访问其中的项目)。如果您知道里面文件的确切名称,则只需在目录中使用 +x 而不是 +r 即可访问它。

如果授予了执行权限,那有什么区别呢?执行 .txt 文件是没有意义的。在 Windows 上,例如有 .exe、.bats 等。在 Unix 系统上,我只知道 .sh。是否有一定数量的扩展名定义可执行文件?

可执行性不是由文件名定义的,而是由其内容定义的。(毕竟,你是执行内容,而不是名称。

当内核知道如何将文件加载为可执行文件时,该文件即可为可执行文件。Linux 内核可以理解 ELF 二进制文件以及以文件头#!作为第一行的“脚本”文件。(大多数其他类 Unix 操作系统也是如此。)因此,只对这两种文件使用 +x 是有意义的。

例如,如果脚本文件以 开头#!/bin/sh,则执行它与手动运行 的效果相同/bin/sh myscript.sh。这同样适用于 Python、Perl、Ruby、TCL、C#、Node/JavaScript 或任何其他语言。(再次注意,文件名的后缀无关紧要 - 只有魔法标头才相关。)

这样做的好处是,您的系统可以使用各种不同语言编写的命令,并且您可以使用它们,而不必关心每个命令使用哪个解释器。

Windows 处于相似的情况。它也有相同的“可执行”权限位,虽然图形界面希望文件名带有 .exe 后缀,但实际内核只关心文件的内容。(Windows 使用 MZ/PE 二进制可执行文件,不支持脚本的 #!。)

相关内容