常常在编辑配置文件,我将打开一个有六然后当我去拯救它意识到我没有类型

sudo vi filename

是否有任何方法得到vi sudo特权,以保存的文件?我似乎回想一下看到的东西关于这一点的同时查找某些东西有关vi前一段时间,但是现在我不能找到它。

有帮助吗?

解决方案

% 是代替目前的文件名称,因此可以使用:

:w !sudo tee %

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

作为一个快捷方式,可以定义自己的命令。放下你的 .vimrc:

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

与上述类型的你可以 :W<Enter> 为保存文件。因为我写了这个,我发现一个更好的方式(在我的意见)以做到这一点:

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

这种方式可以类型 :w!! 它将扩大到全部命令行,留下光标末尾,所以你可以替代的 % 文件名自己的,如果你喜欢。

其他提示

在一般情况下,你不能改变的有效用户标识的第vi过程,但你可以这样做:

:w !sudo tee myfile

共同的警告

最常用的方法得到周围的只读文件的问题是打开一个管道,以前文件的超级用户使用一个执行情况 sudo tee.然而,所有最受欢迎的解决方案,我们发现周围的互联网组合的几个潜在的告诫:

  • 整个文件被写入终端,以及该文件。这可以是缓慢的大型文件,尤其是在慢速网络连接。
  • 该文件失去其模式和类似的属性。
  • 文件中的路径不寻常的人物或空间可能不是正确地处理。

解决方案

得到周围的所有这些问题,可以使用以下命令:

" 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 接受一个文件路径写。 :! 在其自己的运行命令在一个外壳(例如,使用 bash -c).与 :write, 它将执行命令的外壳,并随后写入整个文件 stdin.

sudo 应该是显而易见的,因为这就是为什么你在这里。运行命令的超级-用户。有大量的信息的围绕'net关于如何工作的。

tee 管道 stdin 给定的文件。 :write 会写信给 stdin, 然后在超级用户 tee 将会收到文件的内容和编写的文件。它不会创建一个新的文件--仅复盖内容--因此文件的模式和特性将得到保留。

shellescape() 逃命中的特殊字符的特定文件的道路以适合于当前的外壳。只有一个参数,它将通常只是将路径在报价作为必要的。因为我们送到一个完整的命令,我们会想通过一个非零值作为第二个参数使反斜杠-逃跑的其他特殊字符,否则可能旅行的外壳。

@% 读内容 % 登记册,其中包含当前的缓冲器的文件名称。它不必是一个绝对的道路,所以确保你有没有改变当前的目录。在一些解决方案,你会看到的商业符号从略。根据位置, % 是一个有效的表达,并具有相同效果的读书的 % 登记册。嵌套内部的另一个表达的快捷方式通常是不允许的,但是:例如,在这种情况。

>NUL>/dev/null 重定向 stdout 该平台是空的设备。即使我们已经沉默的命令,我们不希望所有相关的开销用管道 stdin 回vim--最好把尽可能早。 NUL 是空的设备上的DOS,MS-DOS和Windows,没有一个有效的文件。因为Windows8的重定向到NUL不会导致在一个文件命名为NUL正在编写的。尝试创建一个文件桌面上的名NUL,或没有文件的延展你将会无法这样做。(还有其他几种设备的名称在窗户,可能是值得知道。)

~/.vimrc

平台的依赖

当然,你还是不想记住那些和类型,它们每时间。它更容易地图的适当命令为一个简单的用户的命令。要做到这一点,在POSIX,可以添加下面的线给你 ~/.vimrc 文件中,创建,如果它已经不存在:

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

这会让你键入:W(case-sensitive)命令编写的当前文件有超级用户的权限--要容易得多。

独立于平台

我使用一个独立于平台 ~/.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

如果你使用 Vim, 有一个脚本用的命名 sudo。vim.如果你发现你已经打开文件,需要根阅读、类型

:e sudo:%
Vim替换%的名称与当前文件, sudo: 指示sudo。vim脚本采取了阅读和写作。

Ryan的建议总体上是好的,但是,如果下面的步骤3,不要移动的临时文件;它就会有错误的所有权和权限。相反, sudoedit 正确的文件并阅读的内容(使用 :r 等)的临时文件。

如果以下步骤2、使用 :w! 为力的文件的编写。

当你走进入模式的文件需要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

有可能是一个小迂回的方式做到这一点,但它的工作。

一个快速的谷歌似乎得到这样的建议:

  1. 不要试图编辑,如果它是只读的。
  2. 你可能能够改变上的权限的文件。(它是否会让你节省是由于实验。)
  3. 如果你还在编辑无论如何,保存到一个临时文件,然后移动它。

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

这是另一个已经出现,因为这个问题的回答,一个插件称为SudoEdit其提供SudoRead和SudoWrite功能,这将默认情况下试图使用sudo第一和苏如果失败: http://www.vim.org/scripts/script.php?script_id=2709

我有这个我~/.更改:

alias svim='sudo vim'

现在每当我需要编辑一个配置文件我刚刚打开它与svim.

一个快速的黑客可以考虑做一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)

当然我不建议这种方法在一个系统,你是在担心安全,作为一个几秒钟的任何人都可以读取的/更改的文件没有你的实现。

使用 gksudo 而不是的 sudo 为GVim即

cmap w!! w !gksudo tee >/dev/null %
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top