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

D.Z*_*Zou 266 server package-management virtualization system-installation

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

在安装结束时,它会询问您是否需要几个额外的包,例如 OpenSSH 服务器和虚拟机主机。这是我在看的:

对话框提供包

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

虚拟机主机自带哪些包?

Bab*_*ton 318

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

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

列出所有已安装的软件包

less是一个简单的文本阅读器,用于在现有终端窗口中打开的新缓冲区中滚动浏览包列表。该列表不会与其他终端命令和输出混合。点击q返回终端提示。查看man less更多信息。

dpkg -l | less
Run Code Online (Sandbox Code Playgroud)

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

dpkg -l {package_name}
dpkg -l vlc
Run Code Online (Sandbox Code Playgroud)

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

dpkg -l | grep vlc
Run Code Online (Sandbox Code Playgroud)

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

sudo dpkg -S {package_name}
sudo dpkg -S skype
Run Code Online (Sandbox Code Playgroud)

要使用 Grep 进行搜索:

dpkg -l | grep {keywords}
dpkg -l | grep pdf
Run Code Online (Sandbox Code Playgroud)

  • 不要依赖 `dpkg -l packagename` 的退出代码,因为即使包没有完全安装,它也可能返回 0 退出代码 - 请参阅:https://github.com/bitrise-io/bitrise/issues /433 (10认同)
  • 建议使用“dpkg -l”检查软件包是否安装的答案如何能获得超过 300 个赞成票,而不解释输出的哪一部分实际上告诉用户软件包是否安装?请注释您的答案以解释“dpkg -l”的第一列必须说“ii”,否则该软件包未安装。 (9认同)
  • 这和 _dpkg-query -l "packagename" 有什么区别_ (2认同)

Vik*_*nei 83

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

如果已安装,它将打印如下内容([installed]在行尾):

$ apt -qq list awscli
awscli/stable,now 1.4.2-1 all [installed]
Run Code Online (Sandbox Code Playgroud)

如果未安装,输出将是:

$ apt -qq list awscli
awscli/stable 1.4.2-1 all
Run Code Online (Sandbox Code Playgroud)

  • @GabrielStaples 看起来 `apt list` 命令尚未完全记录。16.04 上的一些快速测试似乎表明 `-q` 是 `--quiet` 选项的同义词。第一个 `-q` 阻止打印“完成”这个词。第二个还可以防止打印“列表...”。 (10认同)
  • 您还可以使用该命令的 --installed 选项来限制实际安装的匹配项。 (5认同)
  • `-qq` 有什么用?如果没有它,它似乎也能正常工作,并且该选项不在手册“man apt”中 (5认同)
  • 您可以在包名的末尾放置一个星号作为通配符。 (2认同)

小智 48

dpkg

这个命令是 Debian 包管理器。

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

dpkg -l
Run Code Online (Sandbox Code Playgroud)

您可以查看特定包的详细信息

dpkg -p packagename
Run Code Online (Sandbox Code Playgroud)

要了解它是否已安装,请使用

dpkg -s packagename | grep Status
Run Code Online (Sandbox Code Playgroud)

您可以了解哪个软件包包含您想要的软件

apt-cache search name*  
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你应该使用这个命令来搜索你想要的包名

apt-cache search virtual machine host 
Run Code Online (Sandbox Code Playgroud)


小智 16

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

我在为 ansible playbook 编写任务时搜索了这样的解决方案。

你可以这样做:

/usr/bin/dpkg-query --show --showformat='${db:Status-Status}\n' '<your package name>'
Run Code Online (Sandbox Code Playgroud)

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

  • 这是最优雅的检查方式 (2认同)

sk8*_*her 14

更简单的解决方案:

现在有一个apt list列出可用软件包的--installed命令,该命令将仅显示已安装的软件包。您还可以搜索特定的包

apt list <package>
Run Code Online (Sandbox Code Playgroud)

或者只查看匹配的已安装

apt list <package> --installed
Run Code Online (Sandbox Code Playgroud)

还有--upgradeable--all-versions标志。

如果您不知道确切的包名称,可以使用apt search后跟部分来查看相关包的列表。这将允许您使用部分名称或正则表达式术语来过滤可用包列表,但它没有用于过滤的漂亮标志apt list

另请参阅man apt以获取更多信息。


B. *_*hea 8

我正在写一个新答案,因为Tasksel '任务名称' 没有出现在dpkgapt查询中。这意味着其他答案不完整(或错误)。

“我不记得是否勾选了‘虚拟机主机’复选框..”

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

如果你没有看到这个,那么你可能没有安装“tasksel meta-package ”。


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

如果您想了解 Virtual Machine Host tasksel 元包下安装了什么:

tasksel --list-tasks
Run Code Online (Sandbox Code Playgroud)

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

这给出了正确的任务名称和是否安装的指示。

在你的情况下,这个任务名称是virt-host.


“虚拟机主机自带什么包?”

从最后一个命令中,找到 tasksel 任务名称。这是下一个命令所必需的:

tasksel --task-packages virt-host
Run Code Online (Sandbox Code Playgroud)

这列出了构成名称的单个 Tasksel 元包(由附加的“^”表示)。在你的情况下,它是virt-host^.

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

 apt show virt-host^ | grep "Package:"
Run Code Online (Sandbox Code Playgroud)

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

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

然后:

 dpkg -l {each individual pkg name listed above}
Run Code Online (Sandbox Code Playgroud)

这将告诉您是否安装/卸载了单个软件包(由第二个字母表示:“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具有此元名称的命令。

如果你想删除 tasksel 包,这有点麻烦。请参阅此 Ask Ubuntu 答案或那里的任何其他答案。

请注意,“meta” apt 包与 Tasksel 包名称不匹配。请查阅Tasksel 社区页面了解更多信息。


小智 7

使用 tasksel(sudo apt-get install tasksel如果您还没有它)并运行tasksel --list-tasks.

tasksel 会打印出任务列表,i每个安装的任务旁边都会有一个,未安装的每个任务旁边都会有一个u

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

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


Mar*_* An 5

更新:

比解析输出更好的dpkg是使用dpkg-query输出。如果安装了该软件包,以下命令将installed自行打印:

dpkg-query --show --showformat='${db:Status-Status}\n' package-name
Run Code Online (Sandbox Code Playgroud)

再次抑制错误:

dpkg-query --show --showformat='${db:Status-Status}\n' package-name 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

原来的:

根据josch的反馈,为了完全安装软件包,它的ii旁边应该带有 。因此,要找出答案的命令是:

# if it prints the package, it is installed
dpkg -l package-name | grep -E '^ii\s'
Run Code Online (Sandbox Code Playgroud)

现在,如果根本没有安装它,dpkg 可以打印错误,以防它过去从未安装过。

dpkg-query:找不到匹配的包

我们可以适当过滤以仅获取我们需要的信息。

installed如果安装了该软件包,则会打印以下内容,否则不会打印任何内容。

( ( dpkg -l package-name 2>&1 ) | grep -E '^ii' > /dev/null ) && echo installed
Run Code Online (Sandbox Code Playgroud)