在没有覆盖权限的情况下编辑文件

在没有覆盖权限的情况下编辑文件

是否可以设置文件的权限以使其可编辑但不允许覆盖?

我的意思是可以使用文本编辑器编辑文件,但拒绝任何通过覆盖来替换文件的尝试。用户是root.我知道这不是unix文件权限的常见结构,但我正在寻找一种棘手的方法。

我有一个文件包,因为其中一些文件是根据原始版本进行编辑/定制的。当使用新版本更新包时,我想替换任何未更改的文件,但保护自定义文件(不要错过编辑)。目前,我必须手动执行此操作:写入已编辑的文件,而不是在新的更新中替换。

答案1

由于所有包都会尝试完全覆盖配置文件,因此您可以通过以下方式将文件设置为仅附加模式:

chattr +a bb

因此,您无法删除/截断文件,只能追加它。

但在这种情况下,您将阻止包管理器升级系统。

如果你只是不想让包管理器覆盖你的自定义文件,你可以保留包,在 debian/ubuntu 上,你可以这样做:

echo package-name hold | dpkg --set-selections

这样这个包就不会升级,你的文件会被保留。

答案2

这取决于“覆盖”到底意味着什么。如果这意味着更改现有文件的数据,那么这是不可能的,因为操作系统无法区分“编辑”和“覆盖”——它们都在更改文件的数据。如果这意味着删除并创建具有相同名称的新文件(或将新文件重命名为该名称),则可以通过从包含该文件的目录中删除写入权限来实现。显然,这适用于该目录中的所有文件,而不是某个特定文件。

答案3

首先,对包的重要文件进行 tar 操作。然后升级。安装新版本后,解压保存的文件在另一个目录中,并将您编辑的文件与新的包中的文件进行比较。这样,您将看到新文件是否也没有需要添加/更改的重要内容(即,开发人员可能还对您编辑的文件添加了修改,并且这些更改也应该保留。您不能只需将 new-from-new-package 文件替换为旧的编辑内容,无需先检查这些新文件是否不包含新的重要信息)

答案4

作为 root 执行以下操作:

chattr +i foo.txt

然后尝试:

vim foo.txt

在vim中更改文件并尝试保存它。

一个示例用例是 chattr +i /etc/resolv.conf,这样您讨厌的网络管理器服务就不会用从配置错误的家庭/办公室路由器获取的一些 bum 文件覆盖它。

您可以通过以下方式撤消它:

chattr -i foo.txt

在 Linux 文件系统模型中,这是您能做的最好的事情。没有任何其他解决方案。

相关内容