在vi中获取文件的root权限?

时间:2020-03-05 18:37:28  来源:igfitidea点击:

通常在编辑配置文件时,我会用vi打开一个文件,然后在保存时意识到我没有输入

sudo vi filename

有什么办法赋予vi sudo特权来保存文件?我似乎回想起不久前在查找有关vi的一些东西时看到了一些有关此的信息,但是现在找不到了。

解决方案:

一个快速的Google似乎提供了以下建议:

  • 如果它是只读的,请不要尝试编辑。
  • 我们也许可以更改文件的权限。 (是否让我们保存取决于实验。)
  • 如果仍要进行编辑,请保存到临时文件,然后将其移动。

http://ubuntuforums.org/showthread.php?t=782136

Ryan的建议通常很好,但是,如果执行第3步,请不要移动临时文件。它将拥有错误的所有权和权限。而是使用sudoedit正确的文件并读入临时文件的内容(使用:r或者类似内容)。

如果执行第2步,则使用:w!强制写入文件。

通常,我们不能更改vi进程的有效用户ID,但是可以执行以下操作:

:w !sudo tee myfile

我们可以考虑的一种快速破解方法是,对正在编辑的文件执行chmod,然后用vim保存,然后将chmod返回到文件的原始位置。

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

当然,我不建议在担心安全性的系统中使用这种方法,因为有几秒钟的时间,任何人都可以在不知不觉中读取/更改文件。

当我们对文件进行插入模式时,我们需要使用sudo权限进行编辑,我们会收到一条状态消息,提示我们

-- INSERT -- W10: Warning: Changing a readonly file

如果我想念那,我通常会

:w ~/edited_blah.tmp
:q

..然后..

sudo "cat edited_blah.tmp > /etc/blah"

..或者..

sudo mv edited_blah.tmp /etc/blah

可能有一种不太绕行的方式来做到这一点,但它确实有效。

%被当前文件名替换,因此我们可以使用:

:w !sudo tee %

(vim将检测到文件已更改,并询问是否要重新加载该文件。)

作为快捷方式,我们可以定义自己的命令。将以下内容放入.vimrc中:

command W w !sudo tee % >/dev/null

通过上面的命令,我们可以输入:W <Enter>保存文件。自从我写这篇文章以来,我发现了一种更好的方法(我认为):

cmap w!! w !sudo tee >/dev/null %

这样,我们可以键入:w !!,它将被扩展到完整的命令行,将光标留在末尾,因此我们可以根据需要用自己的文件名替换%%。

如果我们使用的是Vim,则有一个名为sudo.vim的脚本。如果发现我们已经打开了需要root用户访问权限才能读取的文件,请键入

:e sudo:%

Vim用当前文件的名称替换%,然后sudo:指示sudo.vim脚本接管读写。

我的〜/ .bashrc中有这个:

alias svim='sudo vim'

现在,每当我需要编辑配置文件时,都可以使用svim打开它。

这是回答此问题以来出现的另一个插件,名为SudoEdit的插件提供SudoRead和SudoWrite函数,默认情况下,它将首先尝试使用sudo,如果失败则尝试使用su:http://www.vim.org/scripts/ script.php?script_id = 2709

对于GVim使用gksudo而不是sudo,即

cmap w!! w !gksudo tee >/dev/null %