如何在将文件放入文件夹时更改其所有权

如何在将文件放入文件夹时更改其所有权

我需要一些帮助来配置 100TB 卷上的默认文件夹权限,该卷上有 900 多个用户目录。每个用户的硬配额限制为 25GB。

所有用户目录权限都设置为 755,因此每个用户都可以“查看”其他用户的命名空间。然后,我们在每个用户的空间中设置三个标准目录。标准目录的命名及其权限设置如下:

% stat -c '%A %a %n' *
drws-wx-wx 4733 dropbox
drwx------ 700  private
drwxr-xr-x 755  public 

/private 设置为 700,仅供用户访问。每个用户都可以在此目录中存储仅供他们自己查看的数据;

/public 设置为 755,因此数据可以与其他用户共享。用户可以将文件放在公共目录中,以便其他用户可以访问它并复制以供自己使用,但其他用户不能在那里写入;

/dropbox 设置为 4733,因此它被设置为允许其他用户将文件放入其中。组粘性位已打开,因此放入其中的任何文件都将采用 dropbox 文件夹的 GID。

这些文件夹运行良好,设置得当,除了一个我无法解决的问题。从我目前所读到的内容来看,我需要做的事情似乎不可能实现,这对我来说似乎很疯狂(我们真的需要它,而我不可能是唯一需要这种功能的人!)。

需要的是========

我需要能够为每个用户设置默认的 /dropbox 文件夹权限,以便任何文件都可以放入用户的 Dropbox改变所有权对于拥有 Dropbox 的用户。

=======================

根据系统的当前功能,当文件被放到另一个用户的 /dropbox 目录中时,所有权仍属于原始用户。由于 g 和 o 读取位已关闭,原始用户不再有权访问被放置的文件,因为每个 /dropbox 的权限都设置为 733(仅对组和其他用户具有写入访问权限)。由于该文件仍归原始用户所有,因此即使该文件不再由该用户拥有,它仍会计入该用户的配额。如果数据散布在其他用户的 Dropbox 中,人们就无法“清理”自己的 25GB 空间!

这对我们来说真的很糟糕,因为配额的管理方式:虽然我们给每个用户 25GB 的“空间”,但我们实际上给每个用户 25GB 的“数据”,无论它位于树中的哪个位置。这意味着单个用户拥有的数据可以存在于整个地图上,存在于许多不同的 /dropbox 目录中,这使得用户自己几乎不可能管理他们的配额。这也给管理员带来了困难,因为很难在这种大小的卷上找到单个用户拥有的所有数据。

有趣的是,/public 目录权限与我对 /dropox 目录的期望完全一致,只不过是反过来的:如果用户进入另一个用户的 /public 目录,获取文件并将其复制到他们自己命名的文件夹(或其他任何地方),则文件的所有权将更改为执行复制的用户的 ID,因此它将计入新用户的配额,而不是原始用户的配额。这很完美。

另外,我在 /dropbox 目录中设置了 g 粘性位,这样当任何文件被放入其中时,被放入的文件的 GID 就会更改为 dropbox 本身的 GID。如果目标用户不在文件上显示的组中,那么这很方便 — 组被更改,接收用户可以访问该文件。

这种更改可以轻松更改已删除文件的 GID 的更改正是我需要对被移动文件的所有权进行的操作。为文件夹用户打开粘性位与为组打开粘性位不同 — 据我所知,对于已打开用户粘性位的已删除到 /dropbox 文件夹中的文件,不会发生任何更改。

环境:Mac 和 Linux 使用 NFS 文件服务器。用户使用 GUI 和命令行来移动数据。

非常感谢任何帮助或指导。

答案1

大多无法做到这一点,除了在某些基于 BSD 的系统上。

setgid您正在使用的将任何新创建的文件或目录的组设置为拥有该目录的同一组,但在setuid目录中会被忽略,而在文件上则具有完全不同的含义。

来自维基百科设置用户标识文章:

在 UNIX 和 Linux 系统上,目录上的 setuid 权限设置会被忽略。FreeBSD 可以配置为将其解释为类似于 setgid,即强制所有文件和子目录归顶级目录所有者所有。

在从 BSD 派生的系统上,目录的行为就像它们的 setgid 位始终被设置一样,无论其实际值如何。如 open(2) 中所述,“当创建新文件时,会为其赋予包含该文件的目录的组。”

相关内容