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