在本地计算机上共享文件的好方法

我想有一个具有以下属性的目录:

  • 许多用户可以将文件复制到其中
  • 这些用户可以删除/更改这些文件(用户A可以删除/修改复制到此目录中的文件)

它不能使用普通文件权限完成(因为权限保留在副本上)。

这是我在网上发现的:

  • 头脑风暴的想法
  • 蓝图

一些用例:

  • 在本地计算机上共享音乐
  • 简单的git存储库共享(只是让一个裸存储库可以写给很多人)—我知道有像gitosis这样的解决方案
  • 允许许多开发人员修改php应用程序的测试实例而不给他们root(我猜他们会复制文件)—我正领导一个非营利性初级开发人员团队,我需要保持简单!

编辑

AFAIK设置SGID位不适用,它只影响新创建的文件—这些用例的基本工作流程包括复制和其他操作(切换文件的gid不变)

访问控制列表

直接答案是访问控制列表(ACL) 。 是的,你可以找到一个反例,但它们在实践中已经足够好了(不像单纯的可写性,这要求用户一直在思考它)。 他们需要的是系统管理员(root)定义组,如果您希望文件仅由命名组共享(root可以选择委派,例如通过从LDAP接受组,但这是另一个故事)。

您确实需要参与用户拥有022的umask。如果他们经常创建非世界可读文件,则此方案将不起作用。 但如果他们有一个限制性的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这样的解决方案,所以要使用它们。

只需这样做:

 mkdir /src/teamA addgroup teamA chgrp teamA /src/teamA chmod g+rws /src/teamA 

现在teamA小组中的每个人都可以在/src/teamA创建所有内容

神奇的是目录上的sgid(set group id)位。

如果您希望用户能够访问共享文件夹中的文件(例如,不同的人在不同时间登录到同一台计算机并需要访问相同的文件),则可以使用bindfs创建共享目录。

它允许多个本地用户从共享目录及其子目录中读取和写入(创建,删除,重命名,修改…)所有文件(包括新创建的文件)。 每个用户都会看到属于他们的文件和文件夹(包括新创建的文件和文件夹)。

简而言之,你跑

 sudo bindfs -o perms=0700,mirror-only=user1:user2:user3 /home/shared /home/shared 

使user1,user2和user3可以使用/ home / shared。

说明

有关完整说明,请参阅Bindfs-SharedDirectoryLocalUsers(Ubuntu文档) ,包括永久设置(每次打开计算机时)。 我在自己的机器上使用这个目录,每个目录都有不同的共享组(一个文件夹可用于所有帐户,另一个文件夹仅用于工作帐户,另一个仅用于个人帐户)。

从post:

bindfs是一个FUSE文件系统,用于通过权限设置将目录挂载到另一个位置(mountpoint)。 它允许您从挂载点内指定文件的所有权和权限。

主要好处是在共享目录中创建的新文件将inheritance所有权和权限。

访问控制列表(ACL)

文档说明:

如果要为不同的用户和/或组设置更高级的权限,请尝试访问控制列表 。

有关详细信息,请参阅Gilles答案 。

您可以将shellholic的解决方案与cron作业结合使用,该作业每15秒更新一次该文件夹中所有文件的gid或类似的内容。