为什么apt-get安装Virtual Box而不是g ++?


12

我刚遇到一个我不知道可能与Linux终端有关的主要安全问题。我正在尝试安装g ++ 5.0。我是Linux的新手,所以我输入了sudo apt-get install g++ 5.0它安装了Virtual Box,而不仅仅是返回错误或其他内容!

如果我尝试从终端安装一件东西而安装了完全不同的东西,这是否意味着可能会发生其他事情,可能是恶意软件?无论如何,当我输入完全不同的内容时,为什么还要安装Virtual Box?


6
... AFAIK apt-get将询问用户确认,因此您可以插入n并避免安装VirtualBox。...还检查了Ubuntu的存储库,因此一开始就不应安装任何恶意软件包。如果添加随机PPA,则可能会发生这种情况,但这是因为告诉Ubuntu从不可信的来源安装应用程序。
巴库里

1
之所以喜欢(当然还有+1),是因为这个问题确实值得。它显示了对行为的关注不足所带来的(不可逆的)不良影响,并且是促使您不要执行相同的,粗心的错误的动机。
EKons,2016年

12
a major security issue with the Linux terminal不,冷静点 这只是(没有冒犯!)您没有正确阅读/键入-Linux apt-get,或可用的许多不同终端中的任何问题都没有。
underscore_d

2
@ΈρικΚωνσταντόπουλος什么是“不可逆的不良影响”?安装可以轻松卸载的非恶意软件程序?
巴库里

2
等待直到发现“ rm -rf directoryA / directoryB /”(不要尝试!)。您必须小心输入并粘贴为root用户的内容。
pjc50

Answers:


29

命令

sudo apt-get install g++ 5.0 

表示您要安装两个软件包:g++5.0。(软件包名称没有空格,并且apt-get接受多个软件包名称,以空格分隔。)

可能发生的情况是,它按要求安装了g ++,然后安装了与正则表达式匹配的所有软件包(包括版本号)5.0(因为没有实际命名的软件包5.0)。(感谢@edwinksl!)

为避免这种情况,请确保您具有正确的程序包名称,没有空格。您还可以在-s实际执行此操作之前使用该选项来模拟apt-get操作:

sudo apt-get -s install g++ 5.0

将向您显示该命令执行的操作,而无需实际安装任何内容。如果看起来不错,则可以将其删除-s以执行安装。

您也可以考虑使用更易于使用的图形化软件包管理器,例如synapticmuon


4
5.0被用作正则表达式,因此apt不仅可以匹配字符串“ 5.0” ,还可以做更多的事情。
edwinksl 2016年

10
对于不熟悉的人regex,点匹配任何单个字符。由于默认情况下,正则表达式匹配项在字符串中的任何地方都显示,因此"5.0"意味着“任何名称包含5,后跟2个字符,后跟0”。示例“ FooBar 2.510”或“ AcmeWidgets 5.0”(“任何单个字符”的确包含文字点)
MSalters

8

安装g++版本5.x 的正确命令是:

sudo apt-get install g++-5

这将g++在xenial上安装5.3版,这是当前的默认设置(因此apt-get install g++也要安装它,但是将来会更改)。实际上,没有 GCC的公共5.0版本。其他g++发行版已打包,例如g++-4.9g++-6,可以用相同的方式安装。

如果您需要安装g++系统未打包的特定(现有)版本,则必须从源代码构建它


2
这是个好的观点; sudo apt install g++5.0g++和之间没有空格5.0)仍然会失败。
edwinksl

4

让我们分解一下。

首先,关于apt-get install(以及其他大多数apt-get参数)工作原理的几点注释:

  • 您可以输入多个软件包名称:

    sudo apt-get install foobar spamegg 
    
  • 包名实际上是扩展正则表达式(ERE)(检查man 7 regex)模式,让数据包名称foo.bar意味着有一个子与启动任何程序包名称foo和目的与bar使用之间的任何单个字符foobar。可能f.*r是指任何包含子字符串的程序包名称,该子字符串具有fr具有任意数量的字符,即介于两者之间的任何字符。要进行整个程序包名称匹配,请使用开始和结束标记,例如^foo.bar$。如果您想对任何Regex令牌进行字面处理,则需要使用\例如对foo.bar字面处理进行转义,您需要:

    sudo apt-get install 'foo\.bar'
    

    这里的单引号是为了防止shell将模式解释为globing模式,在这种情况下不是必须的,但是foo.*bar如果当前目录中有一个名为eg的文件,则例如对于pattern来说是必需的foo.bar

  • 包名称注意事项。如果有任何与该模式匹配的包,则该模式将按字面意义处理,并且不会进行任何正则表达式解释。例如,对于包模式g++g++无论Regex token是什么,它将在字面上匹配包+。如果g++在定义的存储库中没有命名包,它将被视为ERE模式。

现在,您已经给出了命令:

sudo apt-get install g++ 5.0

这表示:

  • 您要安装两种模式提供的软件包,即g++5.0

  • g++匹配g++如上所述的文字元包

  • 其余部分5.0具有Regex令牌,.即任何单个字符。因此,它将匹配包含的任何软件包名称5<any_character>0。因此,所有具有匹配项的软件包都已选择要安装,并且大概virtualbox-5.0在此过程中也已被选中。

大概您想安装g++version 5,因此可以进行以下操作(此答案中已经提到);元软件包,g++-5将引用g++版本5 的最新可用次要软件包:

sudo apt-get install g++-5

要在配置的存储库中搜索任何软件包,请使用apt-cache(使用ERE如apt-get):

apt-cache search 'g\+\+-[0-9]+'

如果您不想对其进行正则表达式化,请使用less向下滚动较大的列表:

apt-cache search g++ | less

同样,在安装不确定的任何东西之前,请不要使用-y--assume-yes)选项,并首先使用-s--simulate/ --dry-run)测试它:

sudo apt-get install --dry-run foobar

1
+1最完整,最有条理的答案。在回落到RE之前尝试文字匹配;使用扩展RE(与普通RE相对);apt-cache search认识的能力都是很重要的。
arielf
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.