如何检查服务器上是否安装了软件包?


174

我最近安装了Ubuntu Server版本13.10(Saucy Salamander)。但是我遇到了一些问题。

安装结束时,它会询问您是否需要其他几个软件包,例如OpenSSH服务器和虚拟机主机。这是我正在查看的内容:

在此处输入图片说明

现在,我的问题是我不记得是否已选中“虚拟机主机”复选框。如何检查我的服务器是否具有相应的软件包?

虚拟机主机附带哪些软件包?


1
$ apt-cache policy <package-name>,例如$ apt-cache policy dillo
Daniel

Answers:


230

您是否想了解所有带有选项的dpkg命令?阅读以下链接。

15个dpkg命令来管理基于Debian的Linux服务器

列出所有已安装的软件包

这里的“少”是一个简单的文本阅读器,用于在现有终端窗口中打开的新缓冲区中滚动软件包列表。该列表不会与其他终端命令混合并输出。点击“ q”返回终端提示。有关更多信息,请参见“少用人”。

dpkg -l | less

要检查是否已安装软件包:

dpkg -l {package_name}
dpkg -l vlc

检查软件包是否已安装(例如vlc)。如果已安装,请启动该软件包:

dpkg -l | grep vlc

显示软件包的安装位置。“ -S”(大写S)代表“搜索”

sudo dpkg -S {package_name}
sudo dpkg -S skype

要使用Grep搜索:

dpkg -l | grep {keywords}
dpkg -l | grep pdf

1
这和dpkg-query -l“ packagename”之间的
区别

4
不要依赖的退出代码dpkg -l packagename,因为即使未完全安装该软件包,它也可能返回0退出代码-参见:github.com/bitrise-io/bitrise/issues/433
Viktor Benei,2016年

dpkg -l | cut -d " " -f 3 | grep "^vlc"显示所有以vlc
开头的

仅供参考,这对于meta包不起作用,因为它们不直接与dpkg相关。您的回答确实会按要求回答问题。
mtalexan

34

采用 dpkg

该命令是debian软件包管理器。

您可以列出所有已安装的软件包

dpkg -l

您可以通过以下方式查看特定软件包的详细信息:

dpkg -p packagename

并了解是否已安装,请使用

dpkg -s packagename | grep Status

您可以了解哪个软件包包含所需的软件

apt-cache search name*  

在您的情况下,应使用此命令搜索所需的软件包名称

apt-cache search virtual machine host 

29

apt -qq list PACKAGE 也可用于检查是否安装了PACKAGE。

如果已安装,它将打印出类似的内容([installed]在行的末尾带有):

$ apt -qq list awscli
awscli/stable,now 1.4.2-1 all [installed]

如果未安装,输出将是:

$ apt -qq list awscli
awscli/stable 1.4.2-1 all

1
您可以在包名称的末尾加一个星号,以用作通配符。
布兰农

3
您也可以对该命令使用--installed选项,以限制实际安装的匹配项。
mtalexan

2
有什么-qq用 没有它,它似乎可以正常工作,并且该选项不在手册中man apt
Gabriel Staples

3
@GabrielStaples似乎该apt list命令尚未完全记录。在16.04上进行的一些快速测试似乎表明这-q--quietoption 的同义词。第一个-q阻止打印“完成”一词。第二个也防止打印“ Listing ...”。
Anthony Geoghegan

14

我找到了一种仅使用dpkg-query命令而不使用管道来检查软件包安装的方法。

我在编写可写剧本的任务时搜索了此类解决方案。

因此,您可以执行以下操作:

/usr/bin/dpkg-query --show --showformat='${db:Status-Status}\n' '<your package name>'

这只是做事情的另一种方式。


shell模块中可以使用ansible管道。
sjas

4

我写一个新的答案中的tasksel “任务名称”中不显示dpkgapt查询。表示其他答案不完整(或错误)。

“我不记得我是否选中了“虚拟机主机”复选框。

重新运行后,检查名称是否有星号sudo tasksel
(如果正在运行,则为“ itasksel --list-tasks)。

如果没有看到此消息,则可能未安装“ tasksel meta-package ”。


“ ..如何检查我的服务器是否具有相应的软件包?”

如果要了解在“虚拟机主机” tasksel元软件包下安装了什么,请执行以下操作:

tasksel --list-tasks

(您的情况tasksel --list-tasks | grep virt就足够了)

这会给出正确的任务名称并指示是否已安装。

在您的情况下,此taskel名称为virt-host


“虚拟机主机附带哪些软件包?”

在最后一个命令中,找到taskel任务名称。
下一条命令需要此命令:

tasksel --task-packages virt-host

这列出了组成该名称的单个Tasksel元软件包(由附加的'^'表示)。
您的情况是virt-host^

找到正确的元名称后,您可以使用apt:

 apt show virt-host^ | grep "Package:"

(或者apt-cache show ...如果apt show不起作用。)

这将显示构成给定meta包的所有包。

然后:

 dpkg -l {each individual pkg name listed above}

这将告诉您单个软件包是否已安装/卸载(第二个字母表示:“ i”状态表示已安装)。对task / meta包下面列出的所有包执行此操作。

这应该回答原始问题。

旁注:/usr/share/tasksel/descs/ubuntu-tasks.desc还包含Tasksel元软件包的描述。如果您:grep "virt" /usr/share/tasksel/descs/ubuntu-tasks.desc它将显示正确的APT元软件包名称。(您的情况是ubuntu-virt-server)。您也可以使用apt带有该元名称的命令。

如果您想删除taskel软件包,这会有点杂草。请查阅https://askubuntu.com/a/88897/169878或那里的许多其他答案。

请注意,“元” apt软件包与Tasksel软件包名称不匹配。请查阅Tasksel社区页面以获取更多信息。


1
正确回答了两个问题。如果您不赞成,请给出原因,或告诉我为什么不这样做。
bshea

3

使用taskel(sudo apt-get install tasksel如果尚未安装)并运行tasksel --list-tasks

taskel将打印出任务列表i,已安装的u每个任务旁边都有一个,未安装的每个任务旁边都有一个。

如果要安装任务,请使用tasksel install <task>。您要查找的任务的名称是virt-host

软件选择项称为“任务”。


感谢您告诉我任务名称,这是我的问题之一,不确定要查找哪个软件包。
D.Zou 2014年

2

如果有人感兴趣,我创建了一个小脚本,您可以使用该脚本从软件包或应用程序列表中自动进行安装,或者仅检查它们是否已安装:

#!/bin/bash
apt -qq list YOUR_LIST_GOES_HERE | grep -v "installed" | awk -F/ '{print $1}' > /root/list.txt
packages=$(cat /root/list.txt)
grep -q '[^[:space:]]' < /root/list.txt
CHECK_LIST=$?
if [[ $CHECK_LIST -eq 1 ]]; then
echo "Your packages are already installed"
else
echo "Installing packages"
apt-get  install -y $packages
fi

希望它可以帮助某人。


2

更简单的解决方案:

现在有一个apt list列出已安装软件包的命令。您也可以使用

apt list <package>

请参阅man apt以获取更多信息。如果您不知道确切的软件包名称,则可以使用它的apt search后跟部分名称来查看相关软件包的列表。

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.