以root身份重新编辑vim


28

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

Answers:


42

从这个stackoverflow答案中,由skinp

:w !sudo tee %

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


差不多了。。但是重新启动vim并以root身份运行会很好。.到目前为止,这是我最喜欢的:)
rkthkr 2009年

@rkthkr,如果“重新启动vim并以root身份运行”,您将无法保存所做的任何编辑,并且会丢失撤消历史记录。但是,如果那是您想要的... [字符数不足。]请参阅我要编写的“答案”。
布鲁诺·布罗诺斯基

2
@dbr,我认为值得一提的是,在您覆盖文件(使用tee作为sudo)之后,会提示您输入[O] k或[L] oad。后面的选项将清除您的撤消历史记录,并重置“修改标志”,从而使您退出而无需警告您保存更改。我更喜欢前一个选项,它将保留您的撤消历史记录,但是当您尝试退出时会引起警告。您必须使用:q!在这种情况下退出。我这样做是为了验证(例如:!sudo /etc/init.d/httpd configtest)并回滚/重新编辑(如果需要)。
布鲁诺·布罗诺斯基

15

请不要为此拒绝我。我不建议实现此答案,但这是rkthkr要求的答案。

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

做到这一点的方法是用:!sudo vim %
正如我提到的ipozgaj,百分比作为参数(甚至一分论点)获取与路径当前缓冲区替换。(您可能会提示您输入密码。)你有一个新的Vim进程,root所有,也就是原来的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

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

现在,尽管如此,我几乎永远不会这样做。也许,如果我没有足够的咖啡或太多的咖啡,并且我意识到我将需要以超级用户身份编辑更多文件...我可以尝试一下。在14年的管理系统中,我从未有过。但是,直到您对我的首选解决方案(完全与dbr提供的解决方案)表示不满之前,我从未想过。


谢谢理查德!非常有用,我给您+1 :)
rkthkr

这是一个非常高质量的答案:为什么要投反对票?我也+1。

1
感谢@Richard Bronosky,在我的gvim中无法使用sudo密码输入,:w !sudo tee %因此我认为这是一个不错的答案。
埃里克·富通斯

1

我通常将其保存到$ HOME / tmp / apache.conf中的临时文件中(例如),然后

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

这是合并更改的一些额外工作,但很成功。我发现这是在便利和针对不必要的更改进行衡量之间的好方法

在此之前,我曾考虑过ACL或为文件分配相应的组,但是这种方法并不能解决所有问题,或者我经常忘记更改所有权或在不打算这样做的情况下更改文件。

仅适用于目前尚未管理的文件。我们使用的整体解决方案是带有git repo的木偶程序,人们可以在其中本地编辑文件并在适当的服务器上测试更改,如果配置可以按需运行,则更改将被推回到中央存储库,在该存储库中,我们的配置引擎会定期提取更改。


0

我通常做的(不一定是最快的,但肯定是安全的)是做这样的事情(以nsswitch.conf为例):

:w! ~/%

从vim退出,然后执行:

sudo vim nsswitch.conf
1GdG
:r ~/%

这将删除所有行,并读取更改和更新的版本以在其位置进行编辑。使用主目录意味着您不必考虑是否具有访问权限-它比/ tmp更为私有。请注意,这是整个文件的替换:如果您不想添加所有更改,则必须选择。

尽管上述任何答案都令人头疼,但没有理由丢失您的更改。

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.