在没有权限打开时使用vim强制编辑文件

and*_*man 65 linux terminal vim permissions

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

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

DrB*_*eco 108

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

  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权限进行保存。我不会在这里解释它,但上面的参考文献涵盖了许多快捷方式。


Bil*_*key 5

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

第一种方法假设您拥有该文件,但该文件是只读的。

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

:w!
Run Code Online (Sandbox Code Playgroud)

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

第二种方法假设其他人拥有该文件,并且您希望保存对该文件的更改。

实现此目的的一种方法是将原始文件所做的更改保存为 vi 中的 ed 脚本。这个 ed 脚本可以稍后在 vi 之外使用 ed 行编辑器应用于原始文件(或其他类似文件)。

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

因此,假设一个编辑过的 vi 缓冲区,然后执行以下操作

:.,$!diff --ed [original_file] -
Run Code Online (Sandbox Code Playgroud)

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

:w ~/my_ed_script
Run Code Online (Sandbox Code Playgroud)

现在退出vi,使用这个ed脚本来获取一开始无法保存的编辑过的文件。以下是如何从 bash 命令行提示符“$”完成此操作:

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Run Code Online (Sandbox Code Playgroud)

这个命令序列在 word 中的作用是将我们用 diff 生成的脚本连接起来,并将 ed write 命令“w”回显到 ed 的标准输入。Ed 然后将此脚本应用于原始文件的可写副本,并将这些修改后的缓冲区更改写回到文件中。

因此,这是一种使用 vi、diff 和 ed 将在 vi 中执行的工作保存到最初由其他人拥有的文件的方法。