题
常常在编辑配置文件,我将打开一个有六然后当我去拯救它意识到我没有类型
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
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
有可能是一个小迂回的方式做到这一点,但它的工作。
一个快速的谷歌似乎得到这样的建议:
- 不要试图编辑,如果它是只读的。
- 你可能能够改变上的权限的文件。(它是否会让你节省是由于实验。)
- 如果你还在编辑无论如何,保存到一个临时文件,然后移动它。
这是另一个已经出现,因为这个问题的回答,一个插件称为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 %