如何使用sudo在没有root权限的情况下在Vim/Vi中保存文件

时间:2020-01-09 10:44:07  来源:igfitidea点击:

我以普通用户身份登录,并开始在vim/vi文本编辑器中编辑httpd.conf或者lighttpd.conf或者named.conf。
但是,由于权限问题,我无法保存更改(所有配置文件均由root拥有)。
如何在不创建临时文件(/tmp/httpd.conf)的情况下保存文件,然后使用vim/vi本身将其作为root用户移动(mv /tmp/httpd.conf/etc/httpd)?

您可以使用sudo命令的组合(假设为您的帐户配置了sudo)来保存文件,而无需在/tmp中创建第三个文件。
这对于使用sudo命令写入特权文件很有用。
例如,使用此技巧可以保存在vim和vi中编辑的只读文件。

在没有root权限的情况下使用sudo在Vim中保存文件的语法

在此示例中,您将以普通用户身份编辑一个名为/etc/apache2/conf.d/mediawiki.conf的文件:

$ vi /etc/apache2/conf.d/mediawiki.conf

进行一些更改,然后按:w尝试保存,请执行:
Vim无法打开文件(权限问题)

要保存文件,只需执行以下命令:

:w !sudo tee %

使用sudo和tee保存文件

vim和shell命令的作用是:

  • :w写一个文件(实际上是缓冲区)。
  • !sudo用sudo命令调用shell。
  • tee使用tee重定向了write(vim:w)命令的输出。
  • %``%就是当前文件名。在此示例中,它是/etc/apache2/conf.d/mediawiki.conf。换句话说,tee命令以root身份运行,它接受标准输入(或者缓冲区)并将其写入由%表示的文件中。但是,这将提示您再次重新加载文件(按L加载vim本身的更改):

再次在Vim中保存和加载文件而无需登录为根

更新~/.vimrc文件

打开/编辑~/.vimrc文件,并添加以下代码:

"
" Sample command W
" 
command W :execute ':silent w !sudo tee % > /dev/null' | :edit!

保存并关闭文件。
打开vim/vi并尝试使用以下命令编辑特权文件:

$ vi /etc/hosts

现在,只需执行W,即可使用自定义命令编写一个特权文件:
VIM写一个自定义W命令的特权文件

现在,sudo要求您使用密码对自己进行身份验证

关于sudo config的说明

确保将自己添加到sudo文件。
这是我的配置(运行sudo visudo或者su -visudo):

# User privilege specification
root    ALL=(ALL) ALL
%admin  ALL=(ALL) ALL

确保将自己添加到管理组:

# usermod -a -G admin Hyman
# id Hyman

输出示例:

uid=501(veryv) gid=20(staff) groups=20(staff),80(admin),81(_appserveradm),98(_lpadmin),33(_appstore),100(_lpoperator),204(_developer)

尝试使用vim插件写入/编辑特权文件或者只读文件

  • 用户Unix命令,包括sudo,chmod等,无需离开vim!
  • 该插件使vim可以使用sudo或者su或者任何其他可用于更改用户身份验证的工具来读取文件。