Pos*_*vid 42 vim permissions command-line chmod read-only
简短问题:
我们为什么可以操纵使用Vim的只读文件:+ w+ q+ !,即使没有作为一个管理员?
长问题:
我有一个对所有人只读的文本文件 (myFile.txt):
navid@navid-ThinkPad-T530:~/ubuntuTest$ ls -l myFile.txt
-r--r--r-- 1 navid navid 26 Aug 22 21:21 myFile.txt
Run Code Online (Sandbox Code Playgroud)
我可以在没有管理员权限的情况下用 Vim 打开它:
navid@navid-ThinkPad-T530:~/ubuntuTest$ vi myFile.txt
Run Code Online (Sandbox Code Playgroud)
我修改它并按:Esc+ :+ w+ q+Enter我看到这个错误信息:
E45: 'readonly' option is set (add ! to override)
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都说得通。但是当我按下:Esc+ :+ w+ q+ !+ 时Enter,Vim 会保存更改。
我使用的是 Ubuntu 16.04 和 VIM 7.4。
ter*_*don 58
正如@Rob 已经提到的,只有当您对包含文件的目录具有写访问权限时才能执行此操作。例如,尝试对文件执行相同的操作/etc
将失败。
至于如何 vim
做到这一点,它会删除文件并重新创建它。为了测试这一点,我创建了一个由 root 拥有的文件:
echo foo | sudo tee fff
Run Code Online (Sandbox Code Playgroud)
然后继续以vim
您描述的方式编辑文件,但附上该过程strace
以查看发生了什么:
strace vim fff 2> strace.out
Run Code Online (Sandbox Code Playgroud)
然后我检查strace.out
并发现:
unlink("fff") = 0
open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "foasdasdao\n", 11) = 11
Run Code Online (Sandbox Code Playgroud)
因此,文件首先被删除 ( unlink("fff")
),然后创建了一个同名的新文件 ( open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)
) 并将我所做的修改写入其中 ( write(4, "foasdasdao\n", 11)
)。如果您在家尝试此操作,您会看到在使用 编辑它之后vim
,该文件现在属于您而不是 root。
因此,严格来说,vim
不是在编辑您没有写权限的文件。它是从您有写访问权限的目录中删除一个文件,然后创建一个新文件,您也有写访问权限。
Rob*_*Rob 15
只要您拥有父目录,无论权限如何,您都可以删除或替换文件,因为您可以更改目录的内容:)。
用 rm 之类的其他命令试试,它会提示你,但你仍然可以这样做。使目录不可写,这应该停止它。
添加:
刚刚尝试过,但只要我拥有该文件,我仍然可以修改它,即使文件夹是只读的。但是,当我将所有权更改为 root:root 时,它无法打开文件进行写入。所以解决了root(或其他人)拥有的修改文件
Rav*_*ina 15
使用w!
您正在删除原始文件(您可以这样做)并改为编写您的版本。
当您对目录具有写访问权限时,您可以: 在该目录中创建、移动或删除文件。
$ mkdir foo
$ echo hi > foo/file
$ chmod 777 foo
$ chmod 700 foo/file
$ ls -l foo/file
-rwx------ 1 ravexina ravexina 7 Aug 31 03:19 foo/file
Run Code Online (Sandbox Code Playgroud)
现在让我切换用户并更改文件
$ sudo -u user2 -s
$ vi foo/a # save using w! (I wrote into the file bye)
$ ls -l foo/a
-rwx------ 1 user2 user2 7 Aug 31 03:20 foo/file
Run Code Online (Sandbox Code Playgroud)
现在看看里面有什么:
$ cat foo/file
bye
Run Code Online (Sandbox Code Playgroud)
write-readonly
When the 'cpoptions' option contains 'W', Vim will refuse to overwrite a
readonly file. When 'W' is not present, ":w!" will overwrite a readonly file,
if the system allows it (the directory must be writable).
Run Code Online (Sandbox Code Playgroud)
由于您对该目录具有写权限(意味着您可以在其中创建、删除或重命名文件),因此系统确实允许它。
的默认值cpoptions
不包含W
:
'cpoptions' 'cpo' cpo
'cpoptions' 'cpo' string (Vim default: "aABceFs",
Vi default: all flags)
global
Run Code Online (Sandbox Code Playgroud)