我最近安装了Ubuntu Server版本13.10(Saucy Salamander)。但是我遇到了一个问题。
安装结束时,它会询问一些是否需要额外的软件包,例如OpenSSH服务器和虚拟机主机。我正在查看的是:

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

评论

$ apt-cache策略,例如$ apt-cache策略dillo

#1 楼

您是否想了解所有带有选项的dpkg命令?阅读以下链接。
15个dpkg命令,用于管理基于Debian的Linux服务器
列出所有已安装的软件包。
less是一个简单的文本阅读器,用于滚动浏览其中的软件包列表。在现有终端窗口中打开的新缓冲区。该列表不会与其他终端命令混合并输出。按q返回到终端提示。有关更多信息,请参阅man less
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


评论


这和dpkg-query -l“ packagename”有什么区别

–heypaleblue
15年5月24日在17:56

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

–维克多·贝内(Viktor Benei)
16-10-25在18:08

dpkg -l |切-d“” -f 3 | grep“ ^ vlc”显示所有以vlc开头的软件包名称

–anatoly techtonik
17年4月14日在18:49

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

– mtalexan
17年10月11日在19:15

@heypaleblue他们是一样的。在手册页上:“ dpkg也可以用作dpkg-deb(1)和dpkg-query(1)的前端。支持的操作列表可在后面的“操作”部分中找到。遇到的dpkg只是使用指定的参数运行dpkg-deb或dpkg-query ...”

–于富兰
19年11月25日在22:19

#2 楼

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


评论


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

–布兰农
16-10-22在3:09

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

– mtalexan
17-10-11在19:17

-qq代表什么?如果没有它,它似乎可以正常工作,并且该选项不在手动操作中

–加百利·斯台普斯
18 Mar 8 '18 at 0:09



@GabrielStaples似乎apt list命令尚未完全记录。在16.04上进行的一些快速测试似乎表明-q是--quiet选项的同义词。第一个-q阻止打印单词“ Done”。第二个也防止打印“ Listing ...”。

– Anthony Geoghegan
18-4-3在11:39



即使在仿生上,合适的列表似乎仍然是“ WIP”。无论如何进行交互使用,它都能胜任。我认为,一般而言,apt系列并不适合脚本编写,在这种情况下,您仍然需要dpkg。

–于富兰
19年11月25日在18:43

#3 楼

使用dpkg
此命令是Debian软件包管理器。
您可以列出所有已安装的软件包,其中
dpkg -l

您可以通过
dpkg -p packagename
查看特定软件包的详细信息
要了解其是否已安装,请使用
dpkg -s packagename | grep Status

,您可以了解哪个软件包包含所需的软件
apt-cache search name*  

如果您使用的是,请使用此命令搜索所需的软件包名称
apt-cache search virtual machine host 


评论


apt-cache也显示以显示有关软件包的已安装和可安装版本的详细信息。

– Rockallite
20年1月16日,0:56

#4 楼

我找到了一种仅需dpkg-query命令且没有管道即可检查软件包安装的方法。
我在编写用于ansible剧本的任务时搜索了此类解决方案。
您可以执行以下操作:
/usr/bin/dpkg-query --show --showformat='${db:Status-Status}\n' '<your package name>'

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

评论


外壳模块中可以使用ansible管道。

– sjas
17年8月27日在9:51

#5 楼

更简单的解决方案:

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

apt list <package>


搜索特定的软件包。有关更多信息,请参见man apt。如果您不知道确切的软件包名称,则可以使用apt search及其后一部分来查看相关软件包的列表。

评论


这是维克托两年前提到的。

–于富兰
19年11月25日在21:57

#6 楼

我正在写一个新答案,因为Tasksel“任务名称”不会出现在dpkgapt查询中。表示其他答案不完整(或错误)。
“我不记得是否已选中“虚拟机主机”复选框。”
重新输入后,检查名称是否存在星号-运行sudo tasksel(如果正在运行tasksel --list-tasks,则为“ i”)。
如果未看到此消息,则可能未安装“ tasksel meta-package”。

”。 。如何检查我的服务器是否具有相应的软件包?“
如果要了解在Virtual Machine Host任务包元数据包下安装了什么,请执行以下操作:
tasksel --list-tasks

(在您的情况下tasksel --list-tasks | grep virt就足够了)
这会给出正确的任务名称并指示是否已安装。
对于您而言,此任务名称是virt-host

“附带了哪些软件包虚拟机主机?”
从上一个命令中,找到taskel任务名称。下一条命令需要此命令:
tasksel --task-packages virt-host

此命令列出了组成名称的单个Tasksel元软件包(由附加的'^'表示)。您的情况是virt-host^
找到正确的元名称后,您可以使用apt:
 apt show virt-host^ | grep "Package:"

(如果apt-cache show不起作用,请使用... apt show。)
这将显示所有组成给定元软件包的软件包。
然后:
 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软件包,则这会有点杂草。请查阅此Ask Ubuntu答案或那里的许多其他答案。
请注意,“元” apt软件包与Tasksel软件包名称不匹配。请查阅Tasksel社区页面以获取更多信息。

#7 楼

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

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

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

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

评论


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

–邹德D
2014年2月20日在22:11

#8 楼

我创建了一个小脚本,您可以使用该脚本从软件包或应用程序列表中自动进行安装,或者只是检查它们是否已安装:
#!/bin/bash
apt -qq list YOUR_LIST_GOES_HERE | grep -v "installed" | awk -F/ '{print }' > /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

希望对您有所帮助。

评论


该命令总是说,不应在脚本中使用apt。

– Smar
20年4月23日在6:05

#9 楼

检查是否已安装某些软件包,否则请安装缺少的软件包

pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
  sudo apt-get install $pkgs
fi


更多信息,请访问:https://stackoverflow.com/questions/1298066/check-if-an- apt-get-package-is-installed-and-then-install-it-if-its-not-on-linu / 54239534#54239534

以前在类似的技术中提到过:https:// askubuntu .com / a / 1102572/52975

#10 楼

另一种(不一定更好)的方式:查看字段APT-Manual-Installed是否出现在apt show <pkgname>中。如果不存在,则表示未安装该软件包。不幸的是,它没有在apt-cache show <pkgname>中显示。

和往常一样,apt是用于交互使用的,不建议用于脚本编写。