VIM:“ sudo vim bad_idea”?


20

#Vim中的一个irc用户敦促我不要在Vim中使用Sudo,例如:

sudo vim bad_idea

当我在/ var / www /等位置执行操作时,如果没有它,我将无法书写。因此,不使用sudo成为一个问题。当然,我可以在/ tmp /等不同位置进行更改,然后将目录复制到/ var / www。但是,我觉得更简单。

  1. 如果您没有“ sudo Vim”,为什么?
  2. 如果第一个问题是,您如何避免不使用sudo的问题?

Answers:


35

我属于第一类:这sudo vim /var/www/html/some_file是一个坏主意;它允许未记录的外壳转义。而是使用sudoedit /var/www/html/some_file; 具有相同的效果。


5
什么是“未记录的外壳转义”?为什么不仅在/ var / www中无关紧要?
hasen

6
vim可以在命令行上运行其他命令。但是,由于vim是通过sudo启动的,因此是以root身份运行的,因此任何这些命令都将以root特权运行。这些命令称为“ shell转义”,不会像其他sudo调用那样记录下来。而且不仅仅限于/ var / www; 我会在任何地方使用它。我什至在我的bashrc文件中将“ sudo vi”别名为“ sudoedit”。
凯文M

我了解您的意思,并希望同意但要澄清。我们不知道他的正常su和sudo根活动是否已被记录。“ sudo vim”允许以root身份运行子shell-足够准确;在该外壳中,“ sudo”将不会控制根可以做什么和不能做什么。
pbr

3
凯文(Kevin),您如何将“ sudo vi”别名为“ sudoedit”?在bash手册中...“上面的字符/,$,`和=以及上面列出的任何shell元字符或引号字符都不会出现在别名中。” ...空间是它正在谈论的那些元字符之一。
pbr

9
好的,所以它本身不是别名,但是具有相同的效果:'function sudo(){[[[$ 1 == vi]] && shift && sudoedit“ $ @” || 命令sudo“ $ @”; }'
Kevin M

10

请参阅:https : //stackoverflow.com/questions/1005/getting-root-permissions-on-a-file-inside-of-vi

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

:w!sudo tee%


如果您要使用tee,我建议您使用':w!sudo tee%> / dev / null',这样您就不会看到整个文件都对您回显。我通常使用':w!dd of =%'代替,因为这样可以更快地键入并实现相同的功能。当然,这仅是在我忘记使用sudoedit / sudo -e的情况下。
jamessan,2009年

7

vim允许用户执行任意的shell命令,因此许多系统管理员不允许vim与sudo一起使用。

rvim包含在vim中。这是受限制的vim,不允许使用shell命令。(或者出于相同的原因,允许您挂起vim。)

是否需要在自己的盒子上走到那些极端是有争议的。


1
+1。完全同意。sudo vim然后输入:!bash,您便拥有一个以root为根的rvim
shell-

3
实际上,如果您可以sudo vim,那么您可能sudo bash还是sudo su -正确的?
dlamblin

@diamblin特权可以比这更精细地提出,所以不一定。这就是为什么需要rvim的原因。出于所有目的和目的,“ sudo vim”与“ sudo su-”相同。在一个用户虽然是系统管理员的Debian小盒子上,这全是学术性的。
理查德·霍斯金斯

ubuntu如何处理这个问题?在CentOS上vi启动,vim但作为root vi启动vi。在Ubuntu vim上,这两种情况均会使用,并且sudo vi还会启动vim...
cwd

6

编辑系统范围的配置文件时,完全没问题-只要记住您是root即可拥有所有权力,并在不再需要这些特权时立即放弃这些特权。

在特殊情况下/var/www/,即Web服务器页面,您可能需要考虑更改某些所有权/组/权限---但是是否以及在很大程度上取决于您的特定设置(单/多用户,真实Web服务器/仅本地主机,动态/静态等)


6
的确+1,这是处理Web服务器页面的最佳方法。确保您有权访问它们,而不是提升特权。
bedwyr

1
-1当sudoedit将执行相同的工作时,没有理由以提升的特权运行vim。
sml 2010年

4

这样的问题使我sm额。我在安全性的另一面,“安全性不应干扰用户体验,除非它被期望或要求阻止普通人进行恶意活动。”

防止sudo使用vim只是一个创可贴。如前所述,某人可以使用:

sudo su -

要么

sudo /bin/bash

要么

sudo nano file

要么

sudo my_exectuable_text_editor file

如果您真的担心有人在盒子上进行恶意操作,请不要给他们sudo(显然是root密码)特权。没有防止使用sudo进行恶意活动的银色子弹,您只能通过“应用”所有“修复”来确保自己不会做任何恶意来使自己发疯。

有人提到更改所有权/组。这是一个棘手的问题,好像Web服务器是作为另一个用户运行的,并且您更改了文件的权限,现在突然您的站点无法正常工作。好吧,显然这不会帮助您。您可以将自己添加到运行Web服务器的组中,但是,如果该组没有文件访问权限,则需要执行chmod -R g + w *(或chmod单个文件)您想要的文件,如果必须对每个文件进行chmod操作,可能会很麻烦。

甚至有人建议使用rvim。当然,可以只在/ etc / sudoers中添加一行以仅允许某些用户sudo rvim,但是,从逻辑上讲,如果必须走那条路,则实现基于Web的文件管理器可能会更好。这样,它就可以像运行Web服务器的用户一样运行,因此没有文件权限问题,您仍然可以精确控制谁编辑哪些文件。

反正我的两分钱。


2

运行sudo vim不会更改$HOME目录,因此您将以root权限运行Vim,但$HOME仍指向普通用户。

如果这是您第一次运行Vim,则可能~/.viminfo是在普通用户目录中创建了文件,但是具有root权限。


1
取决于sudo。在我的笔记本电脑上sudo vim -c '!echo $HOME' -c q确实提供了我的主文件夹,但是在我的服务器上却给出了/root。我可能不得不看看为什么会这样,可能是因为一个人的OS X而另一个人的Gentoo,或者可能与/etc/sudoers设置方式有关。
Nemo157

啊哈!您是对的-我在这里结束了,想知道为什么我.viminfo只能通过root用户访问。
Ayrat

1

如果这是您自己的计算机 ...除了Denilson指出的一种极端情况,我看不出您无法使用'sudo vim'的任何理由-它可能会创建root拥有的〜/ .viminfo。

如果不是 -如果系统管理员限制了您可以做什么和不能做什么-每个“ man sudo”:“在大多数系统上,可以使用sudo的noexec功能来防止shell脱机。有关详细信息,请参见sudoers(5)手册。 ”

因此,在这种情况下,如果您的系统管理员担心您在vim中以root用户身份运行子Shell的潜力,则可以使用noexec功能。但是...回到最初的情况-如果这是您的计算机,我认为运行'sudo vim'非常安全。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.