Linux:失去文件的组所有权

Linux:失去文件的组所有权

我有一个项目,其中包含我在 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”,因为它明确地从“个人”模式(我编辑的文件只是我自己的)切换到组开发模式(我现在编辑的文件在组之间共享)。

相关内容