我使用 archlinux x64。我正在研究 Web 开发,为了编辑 Apache 所服务的srv/http
目录下由 Apache 提供的文件,我创建了一个组,添加了我的用户和 Apache 的用户,这样我就可以编辑文件,而无需在目录之间移动它们。
问题是,我可以使用我的用户正确编辑目录中的文件,但每当我保存它们时,它的用户和组都会恢复到我的用户和组。例如:
Me: user1:users
Apache: http:http
Directory ownership: http:development
然后我/srv/http/index.html
用我的用户打开该文件,如下所示...
rw-rwr-- 1 http development 1034 Mar 20 20:48 index.html
(如您所见,它具有对所有者和组的读写权限),当我保存它时,文件权限将恢复为这样...
rw-rw-r-- 1 user1 users 1034 Mar 20 20:48 index.html
我无法理解发生了什么,因为如果我输入groups
查看我的用户活动组,我会得到这个lp wheel network video audio storage users development
,确实说我是开发成员。我认为是别的东西。
谁能告诉我发生了什么事以及如何在节省时间的情况下纠正它?
我知道这不是一个大问题,但我想在遇到丢失连字符之类的问题之前纠正它。
PD-如果有必要的话,我使用 Sublime 编辑器。
答案1
在UNIX 中,root
只能更改文件的所有者。因此,我们可以得出结论,该文件的所有者是不是当你编辑它时改变。相反,必须发生的是您的编辑器将编辑的内容写入新文件并用新文件替换旧文件。因为它是一个全新的文件,所以该文件最终会被标记为您是所有者。
以这种方式更新文件有一些优点:
- 它是原子的:读者总是看到旧版本或新版本,而永远不会看到部分编写的新版本。
- 从错误中恢复更容易。如果出现磁盘已满等错误,只需删除新的临时文件(在旧版本之上重命名之前)即可回滚。如果您正在就地更新文件,您可能无法完成和更新,也无法回滚。
- 您可以“更新”您没有写入权限的文件(因为您从未真正写入旧文件)。
- 任何仍打开该文件的用户都可以根据需要继续使用旧版本,因此不会受到干扰。对于可执行文件很有用!
也有缺点:
- 您需要文件所在目录(或至少同一文件系统上的其他位置)的写权限,以便在其中创建新的临时文件,然后重命名该临时文件。
- 您无法保留文件的所有者,并且您可能无法保留其组。
- 在将其移动到位之前,您可以通过将其复制到新的临时文件中来保留一长串其他内容,例如权限、扩展属性、文件是否是到其他地方的实际文件的符号链接,资源分叉(MacOS)等...除非您非常小心且非常详尽,否则很难不错过其中的一个或多个。
所以这是一个妥协。
后台脚本、软件安装等自动化任务通常会选择用全新文件替换旧版本,尤其是因为原子性。
文本编辑器和其他人工任务通常选择就地编辑文件。
我对你们的编辑器不熟悉,但它似乎做出了与大多数其他编辑器相反的选择。您必须看看是否可以将其配置为停止这样做。
顺便说一句,如果文档根目录中的文件所有者由您而不是 apache 用户拥有,那么实际上会更好。它可以更好地确保 Web 服务器(例如,如果受到威胁)无法编辑文件。因此,您可能会考虑忽略这个特定的“问题”并将其视为一件好事。
答案2
是的,有些编辑器基本上会用新编辑的文件删除旧文件。因此,所有者是进行编辑的人,而该组将是您的主要组。
但是,您可以通过使用 ... 更改目录权限来对目录下的文件强制执行组chmod g+s .
。这将导致任何新创建的文件与目录位于同一组中,即使这不是您的主要组。
使用组写入权限执行操作的另一个缺点是,您应该将 umask 至少更改为 002,以便它将创建组可写文件。