vim 以 root 身份重新编辑

rkt*_*hkr 29 root vim vimrc sudo

我经常在 vim 中打开一个文件,进行一些更改,并且何时保存文件是只读的..(由另一个用户拥有)。我正在寻找有关如何以 root 身份重新打开文件并保留更改而无需先将其保存到临时文件以便以 root 身份复制或重新编辑的提示。

dbr*_*dbr 44

从这个stackoverflow 答案,由skinp

:w !sudo tee %
Run Code Online (Sandbox Code Playgroud)

在编辑我没有写权限的文件之前,我经常忘记 sudo。当我要保存该文件并遇到权限错误时,我只需发出该 vim 命令即可保存该文件,而无需将其保存到临时文件中,然后再将其复制回来。

  • @dbr,我认为值得一提的是,在您覆盖文件后(使用 tee 作为 sudo),您将收到 [O]k 或 [L]oad 的提示。后面的选项将删除您的撤消历史记录并重置“修改标志”,让您可以退出而不会收到保存更改的警告。我更喜欢前一个选项,它将保留您的撤消历史记录,但会导致您在尝试退出时收到警告。你必须使用 :q! 在这种情况下退出。我这样做是为了验证(例如:!sudo /etc/init.d/httpd configtest)并在需要时回滚/重新编辑。 (3认同)

Bru*_*sky 17

请不要为此投票给我。我不建议实施这个答案,但这是 rkthkr 要求的答案。

rkthkr 说:
但是重新启动 vim 并以 root 身份运行会很好

这样做的方法是使用:!sudo vim %
我对 ipozgaj 提到的,作为参数(甚至是子参数)的 % 被替换为当前缓冲区的路径。(可能会提示您输入密码。)您最终会得到一个由 root 拥有的新 vim 进程,它是原始 vim 进程的子进程。听起来很傻,对吧?这是它在ps中的样子:

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim
Run Code Online (Sandbox Code Playgroud)

如果您对包含该文件的目录具有写权限并对其进行了编辑,您可能会收到交换文件退出的警告。选择 [R]ecover,将反映父 vim 进程所做的大部分更改。(*我认为交换更新可能是定时的或者有一个增量阈值。我已经在这方面投入了太多时间并且不关心研究它。)当你去退出 vim 时,不要惊慌仍在 vim 中……您打开了第二个 vim 进程。记住?

现在,说了这么多……我几乎永远不会这样做。也许,如果我没有喝足够或太多的咖啡,并且我意识到我将需要以 root 身份编辑更多文件......我可能会尝试这个。在管理系统的 14 年中,我从未有过。但是,直到您对我的首选解决方案(这正是 dbr 提供的)表示不满之前,我从未想过这个问题。