Linux环境下VIVIM编辑文件时无权限保存的解决方法普通用户

在Linux环境下,如果直接使用VI/VIM命令编辑没有编辑权限的文件,保存时会提示用户无法进行保存操作。
使用sudo权限编辑文件,然后保存(如果用户具有sudo权限)。
事实上,在VI/VIM模式下使用一些简单的命令,就可以在不关闭当前文件的情况下保存文件。

方法一

/dev/null的说明如下

该命令使用当前文件(即%)stdin执行传输的sudotee命令。

方法二

使用Linux工作的朋友可能遇到过这样的情况。
发生错误::

E45:'readonly'optionisset

这表明该文件是只读的,被迫保存:w!file-name"E212:无法写入。
此错误是什么意思?请参阅文档:helpE212:

由于某种原因,无法创建或复制您正在写入的文件。
.

据了解可能是由于权限不足造成的,只要记住这个文件需要root权限才能编辑,而编辑前忘记使用sudo启动vim,所以保存失败。
为了防止修改丢失,您需要将temp-file-name保存为另一个临时文件,然后退出Vim,然后运行​​sudomvtemp-file-namereadonly-file-name写入原始文件。

但这个操作非常困难,如果你想暂时保存这个文件并继续更新并保持Vim的工作状态,如编辑历史、缓冲区状态等,你应该怎么做才能在不退出Vim的情况下保存这个文件呢?是否可以获得root权限?

解决办法

答案是可以,执行这个命令即可:

:w!sudotee%

让我们继续分析一下这个命令的工作原理。
首先,向下滚动一下,您就会看到。
您可以:

*:w_c**:write_c*:[range]w[rite][++opt]!{cmd}{cmd}in[range]lineasstandardinput(注意前导空格!')with.hthepreviouscommand|:!|.default[range]":w"commandisthewholebuffer(1,$)

使这个使用方法与上一个命令一致,如图:

:w!sudotee%||||:[range]w[rite][++opt]!{cmd}

我们不指定范围,请参见根行。
帮助文档,不指定范围时,默认为整个文件。
此外,此处未指定选择加入。

在Vim中执行外部命令

下一步是感叹号!由此可见以下部分是国外订单即Sudotei百分比。
文档明确指出这与直接执行:!{cmd}具有相同的效果。
后者用于打开shell并执行命令,并且可以在Vim中读取结果。
想象一下,如果你想将当前工作路径或当前工作路径中的所有文件名导入到Vim中,你可以运行:

:r!pwd或:r!ls

At至此,所有内容都在Vim中读取,无需退出Vim,执行命令,然后复制粘贴到Vim中。
有了它,它就可以自由运行shell,而无需退出Vim。

命令的另一种表示形式

请参阅以前的文档:

在Linesasstandardinput上执行{cmd}

对于这个事实,此:w实际上并不保存当前文件。
:wew-file-name保存时将当前文件的内容保存到另一个新文件名中。
将当前文档的内容写入cmd的标准输入,然后执行cmd,因此整个命令可以转换为等效的简单shell命令:

$catreadonly-file-name|sudotee%

这样看起来“对了”好一点了。
sudo很容易理解,就是切换到root执行下面的命令。
T和%是什么?

%的含义

首先运行:helpcmdline-special可以看到:

在Excommands中,atplaceswhere也可以使用,vendors的特殊含义。

$catreadonly-file-name|sudoteereadonly-file-name

注意:我们在其他地方经常使用%,是的,替换,但是%的作用在那里不一样;执行:Help:%docs查看:

行可以定义为:*:range**E14**{address}*{number}absolutelinenumber...%equalto1,$(theentirefile)*:%*

%表示整个文件,而不是文件名

三通的作用

只剩下一个问题:为什么要用三通呢?它通过管道到达三通,后者做了两件事。
.txt然后复制到标准输出,然后数据通过管道传回标准输入,因此它可以在不接触原始管道的情况下处理数据。
复制一份,保存到文件中,看上图的中间部分,它看起来像一个大字母T,到了数据流分支。
补充一下,这就是T这个名字的由来。
现在上面的命令就很容易理解了。
当然,这里只有一半的信息:T的标准输出相当于省略了输出,因为它后面没有其他命令。
当然,你也可以在末尾添加>/dev/null来显式转储标准输出,但这对整体性能没有影响,并且会增加输入的字符数,因此上面的命令就足够了。

执行命令后

执行上述命令后,会出现以下提示:

W12:warning:File"readonly-file-name"haschangedandthebufferwaschangedinVimaswell参见":helpW12"。
formoreinfo.[O]K,(L)oadFile:

Vim请求文件更新并要求确认或重新加载文件。
建议直接进入O,因为这会显示Vim的工作状态,例如编辑历史、缓冲区等。
,并且撤消和其他操作仍然可以进行。
如果选择L,文件将作为新文件打开,所有工作状态将丢失,此时无法应用撤消,并且备份内容将被清除。

简单的解决方案:映射

您可以将其映射为一个简单的命令,并通过每次放入长命令列表将其添加到.vimrc中:

“AllowsavingoffilesassudowhenIforgottostartvimusingsudo。

cmapw!!w!sudotee>/dev/null%

这样运行就可以了:w!!前面已经解释过,它的作用是转储标准输出内容

另一种思路

是一个相对完整但比较棘手的解决方案可以做同样的功能:

%

%

这个命令看上去没有问题,但是一旦运行,又报错来了:

/bin/sh:readonly-file-name:allowed

shellreturned1

这是怎么回事,原因是重定向完成了在所有命令启动之前.ll执行重定向操作,因此重定向不受sudo影响,并且当前shell本身以普​​通用户启动,没有写入此文件的权限。
所以就出现了上面的错误。

路由解决办法

解决无权限错误的方法有很多,当然还有一个更方便的解决方法:用sudo打开一个shell。
,然后在具有root权限的shell中运行重定向的命令。
执行时,例如:

%'

但是,以这种方式执行时,由于单引号的存在,%不会展开在Vim中并传递到shell,而在shell中的Vim中,%等于nil,因此文件被转换为nil,所有内容都丢失,保存文件失败。

该错误是由于%未展开引起的。
尝试将单引号更改为双引号并重试:

%"

发生这种情况是因为命令已通过。
%在进入shell之前扩展为当前文件名。
扩展了一些内容,例如变量。
转义字符等cmapw!!w!sudosh-c"cat>%"

注意:此处无需将输出重定向到/dev/null。

写在最后

至此,借助Vim强大的动力,实现了两种方案来保存以普通用户启动的Vim中需要root权限的文件。
两者的原理是一样的,vim都可以执行外部命令。
如果您有其他计划,请给我留言。

(全文完成)

Fihu

2014年7月30日深圳

linux下vi编辑只读文档无法保存的解决方法

使用普通用户编辑nginx.conf等配置文件:

保存时,会提示您:NoRootPermission。

可以使用以下方法解决:

保存时添加:

:w!sudotee%

我这里有一个问题。
sudo权限未修改。

使用sudo时它要求xxxisnotinthesudoers文件,其中XXX是您的用户名。
这意味着你的用户名没有使用sudo的权限,所以我们只需要修改/etc/sudoers文件即可。
修改方法如下:

1)进入超级用户模式。
也就是说,输入su-系统会要求您输入超级用户密码;输入密码后,您将进入超级用户模式。
(当然,也可以使用直接root)

2)给文件添加写权限。
那是,键入命令chmodu+w/etc/sudoers。

3)编辑/etc/sudoers文件。
那是,输入命令vim/etc/sudoers输入i进入编辑模式;找到这个字符串:rootALL=(ALL)ALL;输入xxxALL=(ALL)all(xxx是您的用户名);然后,保存(先按Esc键然后输入:wq)并退出。

4)撤销文件的写权限。
那是,输入命令chmodu-w/etc/sudoers。

再次保存:

检查是否成功:

$grepsudonginx.conf

#test:w!sudotee%

说明:

:w:Writeafile。
文件可写;文件仍处于只读模式,通过以下方式退出:q!

!sudo:Callshellsudo命令。

tee:Theoutputofthevi/vimwritecommanddisredirectedinuse.

%:Triggerstheuseofthecurrentfilename.

简而言之,tee命令运行assudo并按照给定的当前文件名执行vi/vim命令。

完整:

我在网上阅读了很多答案,大多数都是一行:

:w!sudotee%;

或者:

您有权限修改该文件吗?

如果您有root权限你

:wq!

其实我想说的就是一行:打开文件时输入sudo。

就是这样:sudovi/etc/crontab命令现在打开文件;该文件是使用root权限安装的。

要在此时退出文件,哇!使用

我想很多像我这样的新手看到上面的答案,大多数人在出现问题时都不知道自己是否有root权限。

来吧小白。