使用 vim 在未经权限打开的情况下强制编辑文件

使用 vim 在未经权限打开的情况下强制编辑文件

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

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

答案1

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

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

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

  1. 来自 StackOverflow
  2. 来自 Geekyboy
  3. 来自 Data Agaric

捷径

问题 #2 通常如此(允许问题,须藤),您可以到您的/etc/vim/vimrc(或~/.vimrc)以下快捷方式:

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

然后您只需输入即可:w!!保存须藤权力。我不会在这里解释,但上面的参考资料涵盖了许多捷径。

答案2

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

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

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

:w!

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

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

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

将当前编辑会话保存为 ed 脚本的一种方法是将原始文件名和编辑的 vi 缓冲区作为标准输入传递给 diff 实用程序,并使用 --ed 命令行开关,即将差异显示为 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、diff 和 ed 将 vi 中执行的工作保存到原来由其他人拥有的文件中的方法。

答案3

只是想解决没有文件写入权限的情况。

:!chmod +w %
:w!

在这期间,vim 会抱怨文件中的更改(因为标志更改)——显然可以安全地忽略它们

答案4

对于没有 sudo 权限的情况,另一种可能性是使用:w /somewhere/where/i/have/permissions/foo.txt,然后按照以下方法稍后处理权限问题瑞安·福克斯

相关内容