我有一个项目,其中包含我在 Linux 中创建的多个文件。
我需要授予另一个用户对这些文件的写入权限。因此我创建了一个“dev”组,他和我都是该组的成员,并将文件的所有权更改为该组。
典型文件现在具有以下权限:
-rw-rw-r-- 1 phil dev 5617 Jul 14 15:45 profile.html
但是,当我编辑文件 profile.html 时,它会像这样恢复到我的状态,而我的同事则失去了编辑的能力。
-rw-rw-r-- 1 phil phil 5617 Jul 14 15:45 profile.html
我该如何避免像这样恢复?更改所有权是错误的做法吗?还是使用了错误的选项?或者这与我的编辑器 (emacs) 配置有关?
答案1
在包含文件夹中,您需要将组更改为 dev,然后使用标记 set-gid。
chgrp dev <containing-folder>
chmod g+ws <containing-folder>
设置 gid 位使在该文件夹中创建的文件继承文件夹的组,并在任何新文件夹上标记 setgid 位。将文件移动到目录中时要小心,因为这将保留其现有权限。
答案2
您可以使用目录上的 setgid 位维护儿童的集体所有权。
chown :dev directory/
chmod g+s directory/
答案3
您还可以使用 grpid 挂载选项挂载文件系统(假设为 ext2/3),这样每当您在目录中创建新文件时,它都会使组所有者与父目录相同。因此,您只需让这些文件所在的目录归组“dev”所有即可。
如果它是根分区则重新挂载它(示例):
sudo mount -o remount,grpid,rw,relatime,errors=remount-ro /
来自‘man mount 8’:
grpid or bsdgroups / nogrpid or sysvgroups These options define what group id a newly created file gets.
当设置 grpid 时,它会采用创建它的目录的组 ID;否则(默认)它会采用当前进程的 fsgid,除非该目录设置了 setgid 位,在这种情况下它会从父目录获取 gid,如果它本身是一个目录,它还会获取 setgid 位设置。
答案4
emacs 的默认行为是通过重命名来创建备份文件。来自 emacs 手册:
Emacs 可以重命名原始文件,使其成为备份文件,然后将保存的缓冲区写入新文件。完成此过程后,原始文件的任何其他名称(即硬链接)现在都指向备份文件。新文件归进行编辑的用户所有,其组是该用户在该目录中编写的新文件的默认组。
有多种方法可以改变这种情况。
- 按照其他人的描述,设置组和粘性位。
- 在编辑文件之前运行“newgrp dev”,这样您的默认组就是 dev。
或者特定于 emacs:
- 在 emacs 中设置 file-precious-flag,它会改变行为以保留组,但有其他副作用。
- 在 emacs 中设置 backup-by-copying-when-mismatch,当导致所有者或组发生变化时,使用复制而不是重命名。
因此,添加到您的 .emacs:
(setq backup-by-copying-when-mismatch 't)
我实际上更喜欢“newgrp dev”,因为它明确地从“个人”模式(我编辑的文件只是我自己的)切换到组开发模式(我现在编辑的文件在组之间共享)。