我想知道为什么在 Linux 中执行权限的设置方式是这样的。执行权限是权限标志,但它们(对于常规文件)也会改变操作系统查看文件的方式。
所以我想知道,有“可执行与不可执行”常规文件的概念的目的是什么?换句话说,如果你让所有常规文件都被操作系统视为可执行命令,并且让执行权限表现得像权限一样,会怎么样?
看起来这与现在的情况唯一的区别在于超级用户无需先更改权限即可执行任何文件。这是原因吗?
或者,重新表述这个问题:超级用户无法在未首先更改权限的情况下执行不可执行文件是否是故意设计的(类似于只读挂载和不可变/仅追加属性的设计,以防止超级用户在未首先更改它们的情况下进行编辑)?
或者这只是系统构建过程中产生的一个意外的副作用?
出于安全原因,防止 root 意外执行似乎是有意义的。
答案1
超级用户无法在未首先更改权限的情况下执行不可执行文件,这是故意设计的吗(类似于只读挂载和不可变/仅追加属性的设计,以防止超级用户在未首先更改它们的情况下进行编辑)?
这是有意为之的设计。但并非为了阻止 root 用户执行某些操作,而是为了防止 root 用户执行某些操作:执行不该执行的文件。在 UNIX 上,如果设置了权限,则可以执行任何操作。如果文件是系统已知的可执行二进制格式,则将以二进制形式执行,如果文件包含舍邦(#!
)行作为第一行,它将由该行中列出的程序作为脚本执行,如果上述两种情况都不适用,它将由作为脚本执行/bin/sh
。如果该文件不打算执行,那么/bin/sh
就会抱怨文件中的垃圾内容……现在,权限可以保护 root 用户免受这种情况的困扰。
答案2
换句话说,如果您让所有常规文件都被操作系统视为可执行命令,并且让执行权限表现得像权限一样,会怎么样?
嗯,我不认为操作系统会将文件视为可执行文件。这更像是文件是否有执行权限。现在,为什么 root 用户实际上依赖于权限才能在某处执行(如果是 root 用户,他应该拥有所有权限),这可能与 shell 有关。也可能是因为没有必要将所有文件都视为可执行文件。我想你仍然会进行系统调用(当你不应该这样做时),即使它们可能什么也不做。