我刚刚遇到了一个问题,我怀疑这可能是 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
以执行安装。
您还可以考虑使用对新手更友好的图形包管理器,例如synaptic
或muon
。
答案2
安装g++
版本 5.x 的正确命令是:
sudo apt-get install g++-5
这将g++
在 xenial 上安装版本 5.3,这是当前默认版本(因此apt-get install g++
也会安装它,但将来会发生变化)。事实上,没有公开发布 5.0 版本GCC。其他g++
版本已打包,例如g++-4.9
或g++-6
,可按照相同方式安装。
如果你需要安装一个特定的(现有)版本,但g++
该版本没有为你的系统打包,那么你必须从来源构建。
答案3
让我们分解一下。
首先,关于apt-get install
(以及大多数其他apt-get
论点)如何运作的一些说明:
您可以输入多个包名称:
sudo apt-get install foobar spamegg
软件包名称实际上是扩展正则表达式 (ERE)(检查
man 7 regex
)模式,因此软件包名称foo.bar
是指任何具有以 开头并以 结尾的子字符串的软件包名称,该子字符串以 和 之间的任意单个字符结尾。可能是指任何包含具有 和 的子字符串的软件包名称,该子字符串具有foo
任意数量的字符,即介于和之间的任何字符。要进行整个软件包名称匹配,请使用开始和结束标记,例如。如果您希望任何 Regex 标记按字面意思处理,则需要使用 转义标记,例如,为了按字面意思处理,您需要:bar
foo
bar
f.*r
f
r
^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