正如中所讨论的了解 UNIX 权限和文件类型,每个文件都有以下权限设置(“文件模式”):
- 所有者/用户(“
u
”), - 所有者组 ("
g
"),以及 - 其他所有人 (”
o
”)。
据我了解,文件的所有者始终可以使用chmod
.所有者下运行的任何应用程序也可以。
如果所有者可以随时更改权限,那么为什么要限制所有者自己的权限呢?
我能看到的唯一用途是保护偶然删除或执行,如果有意的话可以很容易地克服。
这里已经提出了一个相关问题:“所有者”权限存在的原因是什么?群组权限还不够吗?它讨论了为什么所有者的权限不能由单个用户(所有者)组成的虚拟组替换。相比之下,这里我问的是所有者拥有权限的目的原则,无论它们是通过单独的“ u
”八进制还是单独的组+ ACL 来实现。
答案1
有多种原因需要减少所有者的权限(尽管很少会低于组的权限)。
最常见的是对不打算执行的文件没有执行权限。很多时候,shell 脚本是旨在源自其他脚本(例如您的
.profile
)的片段,并且作为顶级进程没有意义。命令完成只会提供可执行文件,因此正确的权限有助于交互式 shell。意外覆盖文件是一个很大的风险 - 它可能通过错误输入命令而发生,甚至在 GUI 程序中更容易发生。从相机复制文件时,我要做的第一件事就是使它们(及其包含的目录)不可写,这样我所做的任何编辑都必须是副本,而不是覆盖原始文件。
有时,文件甚至不可读也很重要。如果我升级 Emacs 并且
~/lisp
目录中的本地软件包出现问题,我会选择性地禁用它们(使用chmod -r
),直到它可以成功启动;然后我可以在修复兼容性问题时使它们一次可读。
用户的正确权限集表示意向性。尽管用户可以更改权限,但行为良好的程序不会这样做(至少在没有事先询问的情况下不会这样做)。而不是将权限视为限制用户,将它们视为限制用户的流程在给定的时间点可以做的事情。
答案2
您似乎在这里忽略了相当重要的一点:行为良好的进程不会到处修改它们有权访问的文件的权限。ls
不会随机使您指向的目录可读,只是为了列出目录内容。如果错误,则ssh
不会“修复”其权限或其包含的文件,它只会拒绝运行。~/.ssh
通常可以安全地假设您可能使用的任何程序都以这种方式表现良好。
这意味着所有者对给定文件设置的权限是通常很荣幸(除非您是 root 用户或以其他方式能够短路 DAC 检查(例如CAP_DAC_OVERRIDE
在 Linux 上),因为理智的程序只信任内核来检查权限),因此通常有用保护给定文件免遭意外修改或执行。虽然这可以相对容易地克服,但用户必须明确地做一些事情来克服它。 IOW,它充当另一个确认步骤,表明“是的,我确实想这样做。”。
但更一般地说,由于通常会尊重所有者权限,因此您可以使用它们执行许多有用的操作:
- 将文件或目录设置为只读(相当于在 Windows 上设置“只读”属性)。
- 将文件标记为不可执行(或将 XDG
.desktop
文件标记为不受信任)。 - 从功能上“隐藏”目录的内容(通过将目录标记为不可读)或文件。这实际上是非常在调试某些应用程序的插件问题时很有用,因为大多数使用每个插件目录或文件的应用程序如果其文件不可读,则表现得好像插件不存在一样。
答案3
大多数时候,我这样做是为了防止意外删除/修改,正如您所建议的。然而,有时我这样做是为了可以对某个树中的所有文件/目录执行批量修改除了那些我“保护”过的人。
答案4
受限所有者权限在受限环境中非常有用,在受限环境中,用户无权访问更改权限的工具。
典型的例子是匿名 FTP 服务器。您可以创建一个“dropbox”目录,其中所有者具有写入权限,但没有读取权限。这允许匿名用户上传文件,但不会列出其他用户已上传的文件。同时,该目录可由其所在组读取,因此我们会将允许从该目录检索的用户放入该组中。如果 FTP 服务器不提供chmod
命令,则匿名用户无法覆盖该命令并授予自己列出目录的权限。