我想要一个具有以下属性的目录:
- 许多用户可以将文件复制到其中
- 这些文件可以被这些用户删除/更改(用户 A 可以删除/修改复制到该目录中的文件)
无法使用正常文件权限来完成此操作(因为复制时保留了权限)。
以下是我在网上找到的:
一些用例:
- 在本地机器上共享音乐
- 简单的 git 存储库共享(只需使一个裸存储库可供许多人写入)---我知道有像 gitosis 这样的解决方案
- 允许许多开发人员修改 php 应用程序的测试实例,而无需授予他们根权限(我猜他们会复制文件)---我正在领导一个非营利性初级开发人员团队,我需要保持这个团队的简单性!
编辑
据我所知,设置 SGID 位是不够的,它只会影响新创建的文件 --- 以及这些用例的基本工作流程 ivnolves 复制和其他操作(保持文件的 gid 不变)
答案1
访问控制列表
直接的答案是访问控制列表 (ACL)。是的,你可以找到一个反例,但它们在实践中已经足够好了(不像单纯的组可写性,它需要用户一直考虑它)。它们确实需要的是,如果您希望文件仅由命名组共享(root 可以选择委派,例如通过接受来自 LDAP 的组,但那是另一回事),系统管理员(root)定义组。
您确实需要参与用户的 umask 为 022。如果他们经常创建非世界可读的文件,则此方案将不起作用。但如果他们的 umask 有限制,则可能是因为他们无论如何都不想共享文件。
启用 ACL
Ubuntu 默认不启用 ACL,因此需要一次性管理员权限。/etc/fstab
使用您喜欢的编辑器进行编辑,并更改acl
与要共享文件的文件系统相对应的每一行:添加到选项中。(确保不要更改任何其他行,也不要使用会换行的编辑器。)以下是acl
添加了选项的示例行:
UUID=5e1ec7ed-face-dead-beef-c011ec7ab1e5 / ext4 errors=remount-ro,acl 0 1
要使选项首次生效,请使用以下命令(针对每个文件系统):
sudo mount -o remount,acl /
从安装 ACL 工具acl
包裹。
设置共享目录
要让群组共享文件mygroup
:
setfacl -m group:mygroup:rwx /path/to/shared/root
setfacl -d -m group:mygroup:rwx /path/to/shared/root
如果人们创建文件并将其复制到共享目录,则这些文件将是世界可读的(因为有 umask),并且组中的任何人都可以添加和删除文件(因为该组是组可写的)。人们不能编辑彼此的文件,但这是一件好事,否则您会立即遇到编辑冲突。
如果您没有 unix 组,则可以逐个添加用户:
setfacl -m user:bob:rwx /path/to/shared/root
setfacl -d -m user:bob:rwx /path/to/shared/root
版本控制
如果你确实希望人们能够就地编辑文件,你还需要一些东西来防止编辑冲突。这就是版本控制。
您不需要上述任何内容即可共享 git 存储库。您知道有类似 gitosis 的解决方案,因此请使用它们。
答案2
只需这样做:
mkdir /src/teamA
addgroup teamA
chgrp teamA /src/teamA
chmod g+rws /src/teamA
现在,teamA
团队中的每个人都可以制作里面的所有东西/src/teamA
神奇之处在于目录上的 sgid(设置组 ID)位。
答案3
如果希望用户能够访问共享文件夹中的文件(例如,不同的人在不同时间登录同一台机器,需要访问相同的文件),可以使用bindfs
创建共享目录。
它允许多个本地用户读写(创建、删除、重命名、修改……)共享目录及其子目录中的所有文件(包括新建文件)。每个用户都将看到属于自己的文件和文件夹(包括新建文件)。
简单来说,你运行
sudo bindfs -o perms=0700,mirror-only=user1:user2:user3 /home/shared /home/shared
使 /home/shared 可供用户 1、用户 2 和用户 3 使用。
指示
看Bindfs-SharedDirectoryLocalUsers(Ubuntu 文档)了解完整说明,包括永久设置(每次打开计算机时)。我在自己的计算机上使用此功能来管理多个目录,每个目录都有不同的共享组(一个文件夹可供所有帐户使用,另一个文件夹仅供工作帐户使用,另一个文件夹仅供个人帐户使用)。
摘自帖子:
bindfs 是一个 FUSE 文件系统,用于将目录挂载到另一个位置(挂载点),并带有权限设置。它允许您从挂载点内部指定文件的所有权和权限。
...
主要的好处是在共享目录中创建的新文件将继承所有权和权限。
访问控制列表 (ACL)
文档指出:
如果你想为不同的用户和/或组设置更高级的权限,请尝试访问控制列表。
看吉尔斯回答更多细节。
答案4
您可以将 shellholic 的解决方案与 cron 作业结合起来,每 15 秒或类似时间更新一次该文件夹中所有文件的 gid。