我遇到了一个奇怪的权限问题,我无法解释。让我解释一下我的用户和组,然后向您展示文件夹权限。
drwxrwsr-x. 2 jenkinsuser applog 4096 Jul 15 09:56 .
drwxrwxr-x. 13 jenkinsuser jenkinsuser 4096 Jul 15 09:40 ..
-rw-r--r--. 1 apache applog 750409 Jul 15 09:56 application.log
我有 2 个用户 apache 和 jenkinsuser。它们都属于名为 applog 的组。我有一个日志文件夹,其权限如上所示。该文件夹已设置 SGID,因此任何新文件的组都将设置为 applog。如您所见,application.log 文件已为该文件设置了 rw-r--r--,我理解这是因为 apache 用户是唯一可以写入该文件的用户。
作为 jenkinsuser,我能够使用 vi/vim 打开文件,因为 applog 具有只读访问权限。当我保存它时(例如,在 vi 中输入 :w),它显示'readonly' option is set (add ! to override)
。当我强制保存时(例如,在 vi 中输入 :w!),它会使用下面显示的新权限进行保存。
drwxrwsr-x. 2 jenkinsuser applog 4096 Jul 15 11:24 .
drwxrwxr-x. 13 jenkinsuser jenkinsuser 4096 Jul 15 09:40 ..
-rw-r--r--. 1 jenkinsuser applog 750448 Jul 15 11:24 application.log
所以我的问题是,如果 jenkinsuser 没有写权限,为什么它可以强制保存文件?我错过了什么?
答案1
vi 删除了旧文件,并写入了同名的新文件。您有权删除旧文件,因为您有包含该文件的目录的写权限。要删除该文件,您可以通过删除对现有文件的引用来更改(写入)目录 inode。当文件的引用计数变为零时,文件系统将释放文件的 inode 和空间。接下来,您可以通过将新文件添加到目录 inode 中再次写入目录 inode。
为了防止这种情况发生,您需要删除该目录的写权限。
请注意,文件和目录上可能还有一些 ACL,它们会覆盖您在 中看到的权限ls -l
。看到.
清单中每行权限右侧的 了吗?这表明有些 ACL 处于活动状态。要查看它们,请运行getfacl /dir/name
。