我的问题类似于另一个,除了询问新创建的文件。
在我的 Unix 盒子里,用户爱丽丝,鲍勃和雄猫在组中雄猫。
Tomcat 服务器的配置文件由用户 tomcat 和组 tomcat 拥有。
我已将此文件的权限更改为按组可读可写,以便 alice 和 bob 可以编辑文件。
但是,我注意到编辑后,该文件将归最后编辑它的用户所有。
问:是否可以更改权限,以便 Alice 和 Bob 可以编辑文件,而不更改其所有权?
编辑文件如何改变其所有权?
答案1
由此产生的用户文件的内容取决于编辑器的作用。一些编辑器通过截断文件并覆盖文件来保存文件(不更改索引节点)。有些编辑器将文件重命名为另一个名称(通常是file
to file~
),并使用原始名称创建一个新文件。修改原始文件使所有者保持不变,创建新文件使新文件由创建进程的 UID 拥有。
我在 Debian 上使用的编辑器中,nano
和joe
,以及nvi
(vim
中的最小版本vim-tiny
)似乎就地覆盖。尽管我认为vim
Emacs 的功能可能是可配置的。
斯蒂芬评论关于原子更新。就地重新创建的问题是文件被截断为零长度,然后写入。另一个进程可以在写入所有数据之前打开并读取它。
原子更新将通过创建新版本来完成,例如file.new
,然后重命名file.new
为file
.留下备份文件,可以创建file.new
、链接file
到file~
,然后重命名file.new
为file
。重命名是原子的,因为任何按名称访问文件的进程都会获取旧版本或新版本,而不是两者之间的任何版本。当然,任何打开的文件句柄都会指向保持打开状态的文件,从而提供文件的一致视图。
来自文件权限从观点来看,保存同一文件(inode)需要对文件本身(但不是目录)进行写访问,重命名并创建新文件需要对目录(但不是原始文件)进行写访问。
(重命名和重新创建也是修复文件权限的一种方法,以防有人在共享目录中创建或修改文件,但忘记授予组对其的写访问权限。)
答案2
作为解释了经过伊尔卡丘,如果正在使用的编辑器在保存时创建了一个新文件,则无法控制所有者文件的。不过,您可能真正关心的是确保 Tomcat 仍然可以读取文件;您可以通过确保他们的组是tomcat
(并且他们可以被他们的组读取)来做到这一点,并且可以通过setgid
在父文件上设置该位来对新文件强制执行目录:
chmod g+s .
因此,如果bob
使用重新创建文件的编辑器编辑文件,则编辑后的文件最终将归 Tomcat 所有bob:tomcat
,并且 Tomcat 仍然能够读取它(至少是典型的umask
)。只要该tomcat
组可以写入父目录,该组中的任何用户都可以编辑该目录中的文件(如果只能通过重新创建它们)。
然而,我建议考虑改变你的流程;您可能不应该直接在 Tomcat 读取文件的位置编辑文件。理想情况下,这些文件将在某种 VCS 中维护,并通过单独的流程(可能是自动化的)进行部署。这样你就可以避免所有这些所有权问题......