vim以root身份重新编辑

我经常在vim中打开一个文件,进行一些修改,当保存文件的时候是只读的(由另一个用户拥有)。 我正在寻找关于如何以root身份重新打开文件的提示,并保留所做的更改,而不必先将其保存到临时文件以作为根目录进行复制或重新编辑。

从这个stackoverflow的答案 , 皮肤

:w !sudo tee % 

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

请不要为此而投票给我。 我不build议实现这个答案,但这是rkthkr所要求的答案。

rkthkr说:
但是,如果重新启动vim并以root身份运行,那就太好了

做到这一点的方法是:!sudo vim %
正如我提到的ipozgaj,作为参数的%(甚至是一个子参数)被replace为当前缓冲区的path。 (可能会提示您input密码。)最终会有一个新的由root拥有的vim进程,它是原始vim进程的subprocess。 听起来很愚蠢,对吗? 这里是它在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 

如果您对包含该文件的目录拥有写入权限,并且已经对其进行了编辑,则可能会发出交换文件退出的警告。 select回收,将反映父vim进程所做的大部分更改。 (*我想也许交换更新是定时的或有一个三angular洲的门槛,我已经把太多的时间,这已经不关心研究它)当你离开vim,不要惊慌,当你还在vim中…你打开了第二个vim进程。 记得?

现在,所有这些说…我几乎不会这样做。 也许,如果我没有足够多或太多的咖啡,我意识到我将需要以root身份编辑多个文件…我可以试试这个。 在14年的pipe理系统,我从来没有。 但是,直到你对我的首选解决scheme表示不满(这正如dbr提供),我从来没有想过这个。

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

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

这是一些额外的工作来合并的变化,但它得到了回报。 我发现这是在便利和测量之间进行不必要更改的好方法

在此之前,我正在考虑ACL或为文件分配相应的组,但是并没有解决所有这些问题,我经常忘记更改所有权或正在更改文件,我不打算这样做。

这只适用于目前尚未pipe理的文件。 我们使用的整体解决scheme是使用git repo的puppet,在这里人们可以在本地编辑文件,并在适当的服务器上testing更改,如果configuration按需要运行,那么更改会被推回到中央存储库,在那里我们的configuration引擎会在常规的intervalls中进行更改。

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

 :w! ~/% 

从vim退出,然后执行:

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

这将删除所有的行,并阅读您更改和更新的版本,在其位置进行编辑。 使用你的主目录意味着你不必考虑是否有访问权限 – 而且它比/ tmp更私有。 注意,这是一个完整的文件replace:如果你不想添加所有的变化,你必须挑选。

尽pipe这些答案中包含头痛,但没有理由失去你的改变。