让多个用户透明地拥有目录和内容的所有权

让多个用户透明地拥有目录和内容的所有权

我有一个目录,我想拥有由系统上的多个用户拥有。也就是说,我希望任何以 运行的应用程序都oli认为这些文件属于oli,就像任何以 运行的应用程序jim都会认为一样。这与仅仅授予权限不同,因为我遇到了一个问题所有权问题。在这种情况下我相信所有用户。

我立即想到的是某种可以透明地转换 ID 的绑定挂载,并且我确信有一种方法可以使用 fuse 来做到这一点,但快速(内核级别)对我来说是更好的选择。


需要明确的是,我并不是在寻求真正的多重所有权,我只是希望多个用户文件作为他们的。据我所知,Linux 中有几个不同的层可以将用户 ID 从一个映射到另一个,因此其中一个层可能可以完成这项工作。

答案1

找出了完全内核 ID 映射的挂载选项。这允许您将任何目录重新挂载到其他位置,并具有不同的所有者/组。

sudo mount --bind -o "X-mount.idmap=u:1000:1002:1 g:1000:1002:1" /home/oli/dir /home/other/dir

oli和用户都other可以写入同一组文件,认为自己是所有者。这也可以相当容易地保存到 fstab 中。


另一个选项是 bindfs/FUSE:

sudo bindfs --map=oli/other:@oli/@other /home/oli/dir /home/other/dir

这提供了相当透明的所有权。帐户other将文件视为自己的。我预计这会比内核映射慢。

答案2

Linux 不支持多个用户拥有文件系统对象。它们必须有一个所有者。

这听起来像是一个 XY 问题。您认为解决方案是拥有多个所有者,但您没有充分解释这个问题(您认为应用程序关心文件所有权;为什么?),而这个问题可能还有其他解决方案,例如组所有权、在容器中运行、更改应用程序以何种用户身份运行等。

答案3

这是一个不需要 sudo/root 并且适用于所有挂载(现在或将来)的解决方案:

# Run each line in terminal
# (this needs to be changed if you want to make this into a script)
sed -n "/^$USER:/s/$UID/65534/gp" /etc/passwd > ~/passwd
sed -n "/^$USER:/s/$UID/65534/gp" /etc/group > ~/group

unshare -mr
mount --bind ~/passwd /etc/passwd
mount --bind ~/group /etc/group

unshare -U
your_app_here

这通过将 nobody 和 nogroup ID 映射到当前名称来实现。最后的 unshare 不会设置任何映射,因此我们变为 nobody 和 nogroup,我们使用上述方法重命名(以及保留主目录和 shell)。我假设您的应用程序正在检查文件的用户名,并且不知道这是否会在遇到检查 uid=65534 的应用程序时中断。如果您允许lsyour_app_here您将看到系统上的每个文件现在看起来都属于您,即使您稍后挂载某些文件。

相关内容