我经常在 vim 中打开一个文件,进行一些更改,当需要保存时,文件是只读的(属于另一个用户)。我正在寻找有关如何以 root 身份重新打开文件并保留更改的提示,而无需先将其保存到临时文件中以供复制或以 root 身份重新编辑。
答案1
由此stackoverflow 答案, 经过皮肤
:w !sudo tee %
我经常在编辑没有写权限的文件之前忘记使用 sudo。当我保存该文件并收到权限错误时,我只需发出 vim 命令即可保存该文件,而无需将其保存到临时文件然后再复制回来。
答案2
请不要因此而投票反对我。我不建议实施这个答案,但这是 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
如果您对包含该文件的目录具有写入权限,并且对其进行了编辑,则可能会收到警告,提示存在交换文件。选择[恢复]将反映最多* 父 vim 进程所做的更改。(*我认为交换更新可能是定时的或具有增量阈值。我已经在这上面花了太多时间,不想去研究它。)当你退出 vim 时,如果你仍在 vim 中,请不要惊慌...你打开了第二个 vim 进程。还记得吗?
现在,说了这么多...我几乎永远不会这样做。也许,如果我喝的咖啡不够或太多,并且我意识到我需要以 root 身份编辑更多文件...我可能会尝试这样做。在 14 年的系统管理经验中,我从未这样做过。但是,直到您对我首选的解决方案(与 dbr 提供的完全相同)表示不满,我才想到这一点。
答案3
我通常将其保存到 $HOME/tmp/apache.conf 中的临时文件中(例如)然后
sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf
这是合并更改的一些额外工作,但它是有回报的。我发现这是一种在便利性和避免不必要的更改的测量之间进行权衡的好方法
在此之前,我一直在考虑 ACL 或为文件分配相应的组,但是都没有奏效,很多时候我要么忘记更改所有权,要么在我不想更改的地方更改文件。
这仅适用于迄今为止尚未管理的文件。我们使用的整体解决方案是带有 git repo 的 puppet,人们可以在其中本地编辑文件并在适当的服务器上测试更改,如果配置按预期工作,则更改将推送回中央存储库,我们的配置引擎会定期从中央存储库中提取更改。
答案4
我通常会这样做 - 不一定是最快的,但肯定是安全的 - 是做这样的事情(使用 nsswitch.conf 作为示例):
:w! ~/%
退出 vim,然后执行以下操作:
sudo vim nsswitch.conf
1GdG
:r ~/%
这将删除所有行并读取您更改和更新的版本以代替进行编辑。使用您的主目录意味着您不必考虑您是否有访问权限 - 而且它比 /tmp 更私密。请注意,这是一个整个文件替换:如果您不想添加所有更改,您必须进行选择。
尽管这些问题的答案都会令人头痛,但没有理由丢失您的更改。