文件权限和保存

lpo*_*ula 4 permissions open-files

假设您打开了一个具有写入权限的文件。同时,当您仍然在某个编辑器中打开文件时,您可以更改权限并删除写入权限。

如果编辑并保存它会发生什么?

Gil*_*il' 6

打开文件时会检查文件的权限。更改权限不会影响已经打开文件的进程可以使用它做什么。这有时用于以附加权限启动的进程,打开文件,然后删除这些附加权限:它们仍然可以访问文件,但可能无法重新打开它。

然而,编辑器通常不保持文件打开。当编辑器打开文档时,在幕后发生的是编辑器将文件内容加载到内存中并关闭文件。保存文档时,编辑器会打开文件并写入新内容。

编辑器在保存文件时可以遵循两种策略之一。他们可以创建一个新文件,然后将其移动到位。或者,他们可以打开现有文件并覆盖旧内容。覆盖的优点是文件的权限和所有权不会改变,并且它甚至可以在只读目录中工作。覆盖的主要缺点是,如果保存中途失败(编辑器崩溃、系统崩溃、磁盘已满……),您会留下一个被截断的文档。不同的编辑选择不同的策略;如果可能的话,好的做法是先写新,然后再移动,并且仅在只读目录中覆盖(在其他地方进行备份后)。

如果编辑器遵循先新建后移动策略,则文件的权限无关紧要:编辑器将创建一个新文件,它只需要对该目录的写权限。有两个例外:如果目录有粘性位,更改文件的所有权(但不是权限)可能会使进程无法将新文件移动到位。另一个例外是在通过ACL支持删除权限的系统上(例如 OSX):从文件中撤销删除权限可能会使移动变得不可能。

如果编辑器遵循覆盖策略,撤销写入权限将无法保存。(但是,一些默认覆盖的编辑器可能会回退到先新建后移动。)

在 Vim 中,您可以通过关闭backupcopy选项来强制覆盖策略;另请参阅为什么在“vi”编辑器中编辑时 inode 值会发生变化?. 在Emacs中,您可以通过设置强制覆盖策略backup-by-copying变量t