编辑后如何维护文件的所有权?


11

我的问题与其他问题类似,除了一个问题是关于新创建的文件。

在我的Unix框中,用户alicebobtomcat属于tomcat组。

Tomcat服务器的配置文件由用户tomcat拥有,并属于tomcat组。

我已将此文件的权限更改为按组可读和可写,以便alice和bob可以编辑文件。

但是,我注意到在编辑之后,该文件归最后一个编辑它的用户所有。

问:是否可以更改权限,以便Alice和Bob可以编辑文件而不更改其所有权?

无论如何,编辑文件如何更改其所有权?


您的目标是确保tomcat继续拥有文件,还是要确保:tomcat服务器继续工作;alice和bob都可以继续编辑文件,并且维持安全性吗?
ctrl-alt-delor

1
我会根据您的问题的表达方式,假设tomcat服务在用户“ tomcat”下运行。这可能是不希望的,因为利用tomcat可能会导致其自身的配置被重写以暴露您可能不希望使用的服务器位。您应该考虑使用可以编写配置的其他组,而tomcat组可以读取但不能写入。
Ed Neville

Answers:


17

文件的最终用户取决于编辑器的工作。一些编辑器通过截断文件并覆盖文件来保存文件(而不更改inode)。和一些编辑器文件重命名为另一个名称(filefile~是常见),并创建与原来的名称的新文件。修改原始文件将使所有者保持不变,创建新文件将使新文件由创建过程的UID拥有。

我在Debian上拥有的编辑器中,nano以及joe,和nvivim(中的最低版本vim-tiny)似乎都就地覆盖了。尽管我认为vim,Emacs的工作方式可能是可配置的。


斯蒂芬评论原子更新。就地重新创建的问题是文件被截断为零长度,然后写入。在写入所有数据之前,另一个进程可以打开并读取它。

原子更新将通过创建新版本来完成file.new,然后重命名file.newfile。留下一个备份文件,就可以创建file.new,链接filefile~然后重命名file.newfile。重命名是原子的,因为按名称访问文件的任何进程都将获取旧版本或新版本,而不会获得任何旧版本。当然,任何打开的文件句柄都将指向保持打开状态的文件,从而在文件上提供一致的视图。


文件权限的角度来看,保存同一文件(inode)需要对文件本身(而不是目录)的写权限,重命名并创建一个新文件需要对目录(而不是原始文件)的写权限)。

(顺便说一下,重命名和重新创建也是一种固定文件权限的方法,以防有人在共享目录中创建或修改文件而忘记给组写访问权限的情况。)


6
创建和重命名也是确保使用POSIX语义自动更新文件的唯一方法。
Stephen Kitt

很好的解释。
曼阿斯巴特·艾哈迈德

13

ilkkachu解释那样,如果使用的编辑器在保存时创建了一个新文件,则无法控制文件的所有者。不过,您可能真正关心的是确保Tomcat仍可读取文件。您可以通过确保它们的组是tomcat(并且它们的组可以读取)来做到这一点,并且可以通过setgid在父目录中设置该位来对新文件强制执行:

chmod g+s .

因此,如果bob使用重新创建文件的编辑器来编辑文件,则编辑后的文件将最终归所有者所有,bob:tomcat并且Tomcat仍将能够读取该文件(umask至少具有典型意义)。只要该tomcat组可以写入父目录,该组中的任何用户都将能够编辑目录中的文件(如果仅通过重新创建它们的话)。

但是,我建议您考虑更改您的流程;您可能不应该直接在Tomcat读取文件的位置编辑文件。理想情况下,文件将保存在某种VCS中,并通过单独的流程(可能是自动化的)进行部署。这样就避免了所有这些所有权问题...


不错的解决方案!
曼阿斯巴特·艾哈迈德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.