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

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

我刚刚遇到了一个问题,我怀疑这可能是 Linux 终端的一个重大安全问题。我当时正在尝试安装 g++ 5.0。我是 Linux 新手,所以我只输入了sudo apt-get install g++ 5.0。它并没有返回错误或其他信息,它安装了 Virtual Box!

如果我尝试从终端安装一个东西,结果它却安装了一些完全不同的东西,这是否意味着其他东西(可能是恶意软件)也可能会发生这种情况?为什么当我输入完全不同的东西时它会安装 Virtual Box?

答案1

命令

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

答案2

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

sudo apt-get install g++-5

这将g++在 xenial 上安装版本 5.3,这是当前默认版本(因此apt-get install g++也会安装它,但将来会发生变化)。事实上,没有公开发布 5.0 版本GCC。其他g++版本已打包,例如g++-4.9g++-6,可按照相同方式安装。

如果你需要安装一个特定的(现有)版本,但g++该版本没有为你的系统打包,那么你必须从来源构建

答案3

让我们分解一下。

首先,关于apt-get install(以及大多数其他apt-get论点)如何运作的一些说明:

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

    sudo apt-get install foobar spamegg 
    
  • 软件包名称实际上是扩展正则表达式 (ERE)(检查man 7 regex)模式,因此软件包名称foo.bar是指任何具有以 开头并以 结尾的子字符串的软件包名称,该子字符串以 和 之间的任意单个字符结尾。可能是指任何包含具有 和 的子字符串的软件包名称,该子字符串具有foo任意数量的字符,即介于和之间的任何字符。要进行整个软件包名称匹配,请使用开始和结束标记,例如。如果您希望任何 Regex 标记按字面意思处理,则需要使用 转义标记,例如,为了按字面意思处理,您需要:barfoobarf.*rfr^foo.bar$\foo.bar

    sudo apt-get install 'foo\.bar'
    

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

  • 在考虑包名时有一个问题。如果有任何包与模式匹配,则该模式将按字面意思处理,不会进行正则表达式解释。例如,对于包模式g++,它将g++按字面意思匹配包,而不管正则表达式标记 是什么+。如果在定义的存储库中没有命名的包g++,它将被视为 ERE 模式。

现在,您已给出命令:

sudo apt-get install g++ 5.0

这意味着:

  • 您需要安装两个提供的包,g++5.0

  • g++g++与上面提到的文字元包匹配

  • 剩余部分5.0具有正则表达式标记,.即任何单个字符。因此,这将匹配包含 的任何软件包名称5<any_character>0。因此,所有具有 匹配的软件包都已被选中进行安装,并且可能virtualbox-5.0也已在此过程中被选中。

假设您想要安装g++版本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

相关内容