从Vim内部成为根


72

有时我会在/etc使用Vim时开始编辑配置文件,但忘记了使用它sudo来启动Vim。不可避免的结果是,在完成编辑后,我遇到了可怕的通知,即我无权保存文件。

大多数情况下,编辑量很小,以至于我退出Vim并再次以root身份进行整个操作。我当然可以保存到可以写入的位置,然后以root身份复制,但这也有些烦人。

但是我敢肯定,sudo从Vim内部成为root或使用它的简便方法,而不必放弃所做的更改。如果该方法不依赖于sudo为用户设置,那就更好了。


1
我养成了使用sudoedit而不是vim进行所有管理员编辑的习惯。这是永远不会遇到此问题的一种方法:)。+1为Gilles的答案
jw013 2012年

这些来自SO的替代性问答均非常有用,因此请在此处链接至它们:在vi中获取文件的root权限?vim“用sudo编写”技巧如何工作?
slm

Answers:


46

sudo不能更改现有进程的有效用户,它总是创建具有提升特权的新进程,并且原始shell不受影响。这是UNIX设计的基础。我通常只是将文件保存到/ tmp作为解决方法。如果您真的想直接保存它,则可以尝试使用Vim的功能,该功能可以将文件通过管道传输到另一个进程。尝试使用以下命令进行保存:

:w !sudo dd of=%

经过测试和工作。然后,Vim会要求您重新加载文件,但这是不必要的:您只需按o以避免重新加载并丢失撤消历史记录。您甚至可以将其保存到Vim命令/函数,甚至将其绑定到键以方便访问,但我将其作为练习留给读者。


2
这是一个有趣的解决方案,但是您可以用替换路径%,在vim中它将是您当前正在编辑的文件的路径。
Reid

如果%文件名包含空格,则应将引号引起来。
直觉

另外:这不会重置'modified'设置;您可以使用手动进行操作set nomodified
直觉

2
实际上,如果您确实要小心,则应exec 'w !sudo dd of=' . shellescape(expand('%'))在文件名包含引号,反斜杠,美元符号等的情况下进行处理
。–

与plaes的Commandlinefu -command有什么不同?

36

将文件保存为root:

:w!sudo tee%


13

调用sudoedit以root身份编辑文件。

vim直接致电时带来的不便视为警告,说明您在做潜在危险的事情时过于随意。



3

这也很好用:

:w !sudo sh -c "cat > %"

这受@Nathan Long在此答案中的评论的启发。

注意

"必须使用,而不是'因为我们要%在传递给shell之前进行扩展。

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.