请教,为什么 vim 的强制保存这么厉害?

2020-10-13 11:52:06 +08:00
 jzq526

无意中发现的一个问题,在 centos7 和 debian 系统上都出现了,应该不是发行版的问题。 先在普通用户主目录下创建一个文件 f1:touch f1 查看其属性:

ls -l

-rw-r--r-- 1 vk vk  26 10 月 13 11:37 f1

然后修改文件 f1 的所有者和所属组:

sudo chown root:root f1

ls -l

-rw-r--r-- 1 root root   0 10 月 13 11:36 f1

在 vk 用户下编辑:vim f1 写入一些内容之后,直接 :w是无法保存的,提示不能写入只读文件。但可以用:w!保存,保存后所有者和所属组就回到了 用户 vk 和 组 vk 。

(但在其他目录下就不行了)

vim 的强制保存这么厉害吗?还是 Linux 对主目录有什么特殊设置?

4540 次点击
所在节点    Linux
15 条回复
whenov
2020-10-13 11:57:16 +08:00
:w[rite]! [++opt] Like ":write", but forcefully write when 'readonly' is
set or there is another reason why writing was
refused.
Note: This may change the permission and ownership of
the file and break (symbolic) links. Add the 'W' flag
to 'cpoptions' to avoid this.
NeezerGu
2020-10-13 11:58:13 +08:00
我以前也不知道,不过我在 mac 下试了下。 换了个思路,在 chown 到 root 之后,不带 sudo 直接 chown 回来是不行的,但我可以删除它,相对于其他自己名下的文件,只是多了个是否确定而已。

那么,vim 自然可以进行,先删除后重新创建并写入的操作(当然可能有更好的解决方案,我只是描述了这并不是只有 vim 可以实现)
xuboying
2020-10-13 12:03:05 +08:00
vim 应该是删了这个文件重新写了一个。这个文件普通用户是可以删掉的。
xuboying
2020-10-13 12:05:38 +08:00
@xuboying 想要证明的话应该有很多办法,比如 ls -li 看文件的实体 node 号是否发生了变化
jzq526
2020-10-13 12:06:57 +08:00
@NeezerGu 删除权限应该是来自于用户对自己的主目录的操作权限,而不是对这个文件的操作权限。用户对自己的主目录有完全控制权,那么对其下的文件也就可以删除,这是文件权限不能决定的。
NeezerGu
2020-10-13 14:07:30 +08:00
@jzq526 vim 就利用这个权限删除再重新创建不就好了?
jzq526
2020-10-13 20:26:07 +08:00
@xuboying 我用 stat 命令查看了 inode 号,没有发生变化
VoldikSS
2020-10-14 20:23:35 +08:00
确实是删除之后重新创建了: https://github.com/neovim/neovim/blob/master/src/nvim/fileio.c#L3165-L3167

而且用 `stat` 命令查看时,文件的创建时间也发生了改变
jzq526
2020-10-15 18:30:08 +08:00
@VoldikSS 我刚才试了一下,时间确实变了。但我又创建了一个文件,没有改变所有者等属性,保存后,它的时间也变了,而且是三个时间都变了。也就是说,不管是不是强制保存,文件的三个时间属性都会发生改变
VoldikSS
2020-10-16 15:04:39 +08:00
> 但我又创建了一个文件,没有改变所有者等属性,保存后,它的时间也变了,而且是三个时间都变了。

我试了下结果不是这样,创建时间 没有变欸
jzq526
2020-10-16 16:33:40 +08:00
@VoldikSS 这是修改所有者之后强制保存的,所有的时间都变了
```
vk@vk-debian:~$ rm f1 f2
vk@vk-debian:~$ touch f1
vk@vk-debian:~$ stat f1
文件:f1
大小:0 块:0 IO 块:4096 普通空文件
设备:804h/2052d Inode:171 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 1000/ vk) Gid:( 1000/ vk)
最近访问:2020-10-16 16:28:49.059459602 +0800
最近更改:2020-10-16 16:28:49.059459602 +0800
最近改动:2020-10-16 16:28:49.059459602 +0800
创建时间:2020-10-16 16:28:49.059459602 +0800
vk@vk-debian:~$ sudo chown root:root f1
[sudo] vk 的密码:
vk@vk-debian:~$ stat f1
文件:f1
大小:0 块:0 IO 块:4096 普通空文件
设备:804h/2052d Inode:171 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2020-10-16 16:28:49.059459602 +0800
最近更改:2020-10-16 16:28:49.059459602 +0800
最近改动:2020-10-16 16:29:08.523425651 +0800
创建时间:2020-10-16 16:28:49.059459602 +0800
vk@vk-debian:~$ vim f1
vk@vk-debian:~$ stat f1
文件:f1
大小:11 块:8 IO 块:4096 普通文件
设备:804h/2052d Inode:171 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 1000/ vk) Gid:( 1000/ vk)
最近访问:2020-10-16 16:29:48.343175347 +0800
最近更改:2020-10-16 16:29:48.343175347 +0800
最近改动:2020-10-16 16:29:48.343175347 +0800
创建时间:2020-10-16 16:29:48.343175347 +0800

```
这是没有修改所有者的情况:
```
vk@vk-debian:~$ touch f2
vk@vk-debian:~$ stat f2
文件:f2
大小:0 块:0 IO 块:4096 普通空文件
设备:804h/2052d Inode:2063 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 1000/ vk) Gid:( 1000/ vk)
最近访问:2020-10-16 16:31:13.618070299 +0800
最近更改:2020-10-16 16:31:13.618070299 +0800
最近改动:2020-10-16 16:31:13.618070299 +0800
创建时间:2020-10-16 16:31:13.618070299 +0800
vk@vk-debian:~$ vim f2
vk@vk-debian:~$ stat f2
文件:f2
大小:9 块:8 IO 块:4096 普通文件
设备:804h/2052d Inode:2082 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 1000/ vk) Gid:( 1000/ vk)
最近访问:2020-10-16 16:31:31.381773198 +0800
最近更改:2020-10-16 16:31:31.381773198 +0800
最近改动:2020-10-16 16:31:31.385773129 +0800
创建时间:2020-10-16 16:31:31.381773198 +0800

```
所有的时间都变了。
此外,用 stat 命令查看时,在 CentOS7 中显示的是三种时间,没有创建时间。但在 debian testing 中显示四种时间,包括创建时间。应该是新版系统后加的吧
IgniteWhite
2020-10-16 17:01:30 +08:00
我遇到有时候 w!也是不行的,必须要 sudo 打开 vim
wweir
2020-10-16 17:47:10 +08:00
我觉得 Vim 的强制保存还不够,所以单独写了条按键映射

noremap <M-W> <ESC>:w !sudo tee %<CR>:e!<CR>:x<CR>
VoldikSS
2020-10-16 21:40:29 +08:00
@jzq526 这就不清楚了,好奇怪
jzq526
2020-10-17 07:47:37 +08:00
@IgniteWhite 这个情况目前只在一种情况下发现了:在用户编辑在自己的主目录下编辑所有者不是自己的那些文件。其他情况我还没怎么试过

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/714451

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX