在本地计算机上共享文件的好方法
我想有一个具有以下属性的目录:
- 许多用户可以将文件复制到其中
- 这些用户可以删除/更改这些文件(用户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或类似的内容。