在没有权限的情况下使用vim强制编辑文件


51

我使用vim编辑文件。有时,我忘记拥有适当的权限。我运行vim并将文件作为只读文件运行。我可以进行更改,但实际上无法编写更改。每隔一段时间,我最终打开一个文件并对其进行更改,意识到我没有以sudo运行该文件,对自己大喊大叫,然后强行退出并以root用户身份再次打开它。

有没有解决方法?尽管文件处于只读状态,我仍可以强制对文件进行更改吗?我至少可以保存更改,运行diff并将文件合并在一起吗?


3
这个问题似乎已经在这里找到答案:stackoverflow.com/questions/1005/...
秋季

我很抱歉。我没有找到回应。谢谢。
andor kesselman 2013年

3
使用[写的Vim使用sudo技巧] [1]:W须藤发球%[1]:stackoverflow.com/questions/2600783/...
马蒂亚斯阿斯伦德

Answers:


81

根据您当前的问题,似乎有一些不同的方法:

  1. vi 只读。如果您的文件有,:set readonly您可以
    • 使用:w!强制写入,或
    • 问题:set noreadonly,然后使用正常:w
  2. 一个权限问题(须藤):你可以不写,但是你有sudo的权利。
    • 问题::w !sudo tee %。这会将缓冲区写入tee,该命令接收管道信息并可以写入文件。并且由于tee使用sudo功能运行,因此tee可以修改文件。
  3. 一个权限问题(没有sudo的):你没有权利写文件,你没有管理权限。
    • 用于:w! ~/tempfile.ext将更改写入临时文件,然后采取措施将临时文件移至目录(将临时文件发送至目录所有者/管理员)。

你可以在这里读更多关于它的内容:

  1. 从StackOverflow
  2. 从Geekyboy
  3. 来自数据木耳

捷径

由于通常是问题2(权限问题,使用sudo),因此您可以使用/etc/vim/vimrc(或~/.vimrc)以下快捷方式:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

然后,您可以键入:w!!sudo进行保存。我不会在这里解释,但是上面的参考涵盖了许多快捷方式。


1
和你一样,我刚刚获得了死灵法师徽章!谢谢!我现在想捍卫Mordor。;)
Beco博士

5

我可以想到两种方法来做到这一点。

第一种方法假定您拥有该文件,但该文件为READONLY。

只需在写命令(:w!)中使用vi的感叹号后缀来强制覆盖您自己的READONLY文件。当然,这假定您有权在当前文件夹中编写和执行。

:w!

将导致vi覆盖原始的READONLY文件。

第二种方法假定其他人拥有该文件,并且您想将更改保存到该文件。

一种实现方法是从vi内部将对原始文件所做的更改保存为ed脚本。该ed脚本可以在以后的某个时间用ed行编辑器应用于原始文件(或其他类似文件)。

将当前编辑会话保存为ed脚本的一种方法是使用--ed命令行开关将原始文件名和已编辑的vi缓冲区作为标准输入传递给diff实用程序,即,将差异显示为ed脚本。

因此,假设编辑了vi缓冲区,然后执行以下操作

:.,$!diff --ed [original_file] -

这将diff生成的ed脚本(diff --ed [original_file]-)替换了当前缓冲区(。,$!)中的所有行,这些脚本将原始文件转换为当前缓冲区的内容。然后,我们希望将此ed脚本保存到安全的地方,并将该脚本应用于我们可以写入的原始文件的版本。因此,将脚本保存到可写位置,例如您的登录文件夹:

:w ~/my_ed_script

现在退出vi,并使用此ed脚本获取无法首先保存的已编辑文件。这是从bash命令行提示符“ $”完成此操作的方法:

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

这个命令序列的用词是将我们用diff生成的脚本进行分类,并将ed写入命令“ w”回显到ed的标准输入。然后,Ed将此脚本应用于原始文件的可写副本,并将修改后的缓冲区更改写回到该文件中。

因此,这是一种将vi中执行的工作保存到最初由vi,diff和ed所拥有的文件的文件的方法。


1

只想覆盖没有文件写入权限的情况。

:!chmod +w %
:w!

在这两次之间,vim会抱怨文件更改(因为标志更改)-显然可以忽略它们


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.