linux -获取vi中文件的根权限?

Translate

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

sudo vi filename

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

This question and all comments follow the "Attribution Required."

所有的回答

Donahue Lee
Translate

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

:w !sudo tee %

(vim将检测到文件已更改,并询问是否要重新加载该文件。通过选择说是[L]而不是确定。)

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

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

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

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

这样您可以输入:w!!并将其扩展到完整的命令行,将光标保留在末尾,因此您可以替换%如果愿意,可以使用自己的文件名。

来源
Translate

通常,您无法更改vi进程的有效用户ID,但可以执行以下操作:

:w !sudo tee myfile
来源
Translate

常见警告

解决只读文件问题的最常见方法是使用以下实现以超级用户身份打开到当前文件的管道sudo tee。但是,我在Internet上发现的所有最流行的解决方案都有以下几个潜在警告:

  • 整个文件以及文件都将写入终端。对于大文件,这可能会很慢,尤其是在网络连接速度慢的情况下。
  • 该文件丢失其模式和相似属性。
  • 带有不寻常字符或空格的文件路径可能无法正确处理。

解决方案

要解决所有这些问题,可以使用以下命令:

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

这些可以缩短,敬请注意:

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

说明

:开始命令;您将需要在正常模式下键入此字符以开始输入命令。在脚本中应该省略它。

sil[ent]禁止命令输出。在这种情况下,我们要停止Press any key to continue运行后出现的类似提示:!命令。

exec[ute]将字符串作为命令执行。我们不能只跑:write因为它不会处理必要的函数调用。

!代表:!命令:唯一的命令:write接受。一般,:write接受要写入的文件路径。:!独自在shell中运行命令(例如,使用bash -c)。用:write,它将在外壳中运行命令,然后将整个文件写入stdin.

sudo应该很明显,因为这就是为什么你在这里。以超级用户身份运行命令。网上有很多有关其工作原理的信息。

tee管道stdin到给定的文件。:write将写信给stdin,然后是超级用户tee将接收文件内容并写入文件。它不会创建新文件-只会覆盖内容-因此将保留文件模式和属性。

shellescape()在给定的文件路径中转义适合当前shell的特殊字符。仅使用一个参数,通常仅在必要时将路径用引号引起来。由于我们要发送到完整的shell命令行,因此我们希望传递一个非零值作为第二个参数,以启用其他可能反跳外壳的特殊字符的反斜杠转义。

@%读取内容%寄存器,其中包含当前缓冲区的文件名。它不一定是绝对路径,因此请确保您尚未更改当前目录。在某些解决方案中,您将看到省略商业广告符号。根据位置,%是有效的表达式,其作用与读取%寄存器。但是,嵌套在另一个表达式中的快捷方式通常是不允许的:例如在这种情况下。

>NUL>/dev/null重新导向stdout到平台的空设备。即使我们已经使命令静音,我们也不希望与管道关联的所有开销stdin回到vim-最好尽快将其丢弃。NUL是DOS,MS-DOS和Windows上的空设备,不是有效文件。从Windows 8开始,重定向到NUL不会导致写入名为NUL的文件。尝试在桌面上创建一个名为NUL的文件,带有或不带有文件扩展名:您将无法执行此操作。 (Windows中还有一些其他的设备名称可能值得了解。)

〜/ .vimrc

平台相关

当然,您仍然不想记住这些内容并每次都键入它们。将适当的命令映射到更简单的用户命令要容易得多。为此,您可以在POSIX上添加以下行~/.vimrc文件,如果尚不存在,则创建它:

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

这将允许您键入:W(区分大小写)命令以具有超级用户权限写入当前文件-更加容易。

平台无关

我使用与平台无关的~/.vimrc跨计算机同步的文件,因此我添加了多平台功能。这是一个~/.vimrc仅具有相关设置:

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF
来源
Translate

如果您正在使用Vim,有一个名为sudo.vim。如果发现已打开需要root用户访问权限的文件,请键入

:e sudo:%
Vim replaces the % with the name of the current file, and sudo: instructs the sudo.vim script to take over for reading and writing.

来源
Translate

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

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

来源
dbr
Translate

当您对文件进行插入模式时,需要使用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

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

来源
Translate

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

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

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

来源
Translate

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

来源
Translate

我的〜/ .bashrc中有这个:

alias svim='sudo vim'

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

来源
Translate

您可以考虑的一种快速破解方法是,对正在编辑的文件执行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)

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

来源