即使文件的写入位处于关闭状态,用户如何编辑文件

即使文件的写入位处于关闭状态,用户如何编辑文件

这就是我想在我的训练机上使用 umask 的冲动。

我创建了测试用户 john 并使用 john 登录。并将 umask 设置为 0200 并在 vim 中创建一个测试文件并保存。现在这个测试文件的权限是

-r--rw-rw-. 1 john john 26 Jun 28 12:25 testfile

现在我再次尝试编辑该文件并输入了一些乱码。

现在,当我尝试使用“:wq”保存时,编辑器说文件是只读的,无法保存。但是当我在末尾添加感叹号时“:wq!”它保存了文件。

刚刚发生了什么 ??即使测试文件中的写入位关闭

主机操作系统 = RedHat (rhel) 7.2

答案1

与“wq”、“!”要求 Vim 忽略只读属性。从文档:

:wq [++opt] 写入当前文件并退出。当文件为只读或缓冲区没有名称时,写入失败。当参数列表中的最后一个文件尚未编辑时,退出失败。

:wq! [++opt] 写入当前文件并退出。当当前缓冲区没有名称时写入失败。

注意区别:没有“!”,“当文件只读时失败......”;这不再适用于“!”。

至于为什么会在技术上发生这种情况,因为你是文件的所有者,Vim 可以有效地忽略它的权限(最坏的情况是,它可以改变它们并恢复它们)。实际上,Vim 支持多种写入只读文件的方法:

  • 如果目录是可写的,它将重命名现有文件(添加~到其名称中),创建一个新文件,将新内容写入该文件,并恢复原始文件的权限(即使运行 Vim 的用户不是文件的所有者);
  • 如果目录不可写,它会将文件备份到可写目录(~/tmp通常),更改文件的权限以使其可写,将新内容写入文件,并恢复其原始权限(唯一的工作如果运行 Vim 的用户是该文件的所有者)。

答案2

在我的回答中,我不会关心 Vim,而是看看你偶然发现的底层机制。了解这些很重要,因为它会影响整个系统的安全。

它与所有者无关:尝试一下,创建一个不属于您的文件,然后让您自己读取而不是写入。您将得到相同的结果。那么这是为什么呢?

(尽管可以通过成为所有者、root 或具有 CAP_CHOWN、CAP_DAC_OVERRIDE 或 CAP_FOWNER 或其他能力来实现。)

这是因为目录的权限。该目录是可写的,因此 vim 可以删除文件,也可以添加文件。因此,这就是它的作用。它删除旧的并用新的替换它。这使得文件上的 w 位主要是建议性的(尽管如果目录上没有写入则不是)。

它可能以比这更安全的方式做到这一点:移动旧的,创建新的,删除旧的。

相关内容