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