如何列出用户安装的应用程序(而不是软件包)?

不是所有的软件包和应用程序,只是用户自己从任何来源安装的应用程序(软件中心、手动添加的PPA等)。
如果以上不可行 - 列出所有已安装的应用程序或至少提供一个GUI界面,列出应用程序,以便我可以截图。
我已经阅读了十几个类似的问题,人们发布的答案通常与问题本身没有太大关联。请注意,我的问题包括“用户安装”。
回答: 在Ubuntu Linux中目前无法实现。 (尽管选择tijybba的答案最接近)
4个回答

你实际上可以使用Ubuntu软件中心,如下图所示:

Ubuntu Software Center: "Installed"-menu

另外,你也可以在Synaptic的左下角列表选择中看到它。
通过`cd /etc/apt/sources.list.d/ && cat *.list`命令,您可以获得系统中所有软件源的列表。
您还可以使用Y PPA manager来备份和更新您的软件源。
第二种方法
[由于这种方法涉及安装所有软件包,但如果我们认为新安装的操作系统已经有了那90%的软件包,那么它将忽略现有的软件包并手动安装新添加的软件包,这些软件包只是您手动安装的应用程序]
此方法来源于这里
sudo dpkg --get-selections > installed-applications.txt

它将在主文件夹中生成一个已安装应用程序的txt文件列表。
要使用此文件安装相同的应用程序,您需要执行以下操作(但在此之前,请添加所有以前版本中存在的第三方存储库)。
sudo dpkg --set-selections < installed-applications.txt
sudo apt-get -y update
sudo apt-get dselect-upgrade

这也可以通过GUI方式实现。
sudo add-apt-repository ppa:webupd8team/mintbackup && sudo apt-get update
sudo apt-get install mintbackup

enter image description here

我猜图片几乎可以自己说明问题,备份你的选择,然后在新的安装中恢复它。

无法添加PPA:'ppa:webupd8team/ubuntu/mintbackup'。 名为'webupd8team'的团队没有名为'ubuntu/mintbackup'的PPA。 - alhelal
dpkg: 警告:第1574行的软件包不在状态或可用数据库中,例如wireshark和其他所有应用程序。 - alhelal

apt-mark showmanual会给你一个“手动安装”的软件包列表。这包括由安装程序安装的软件包,其中大部分都是如此。但是,如果你在安装后运行它并稍后再次比较输出,你将得到一个用户明确请求的软件包列表,不包括自动安装的依赖项。

例如:

$ # Save the current list of manually installed packages
$ apt-mark showmanual | sort > original-package-list

# ...time passes...

$ # Compare the old list with the current list
$ # (this will output a list of packages that have been installed by the user since the last command)
$ apt-mark showmanual | sort | comm -13 - original-package-list

请注意,就软件中心和手动添加的PPA而言,应用程序被视为软件包。我认为,区分明确请求的软件包和为满足依赖关系而引入的软件包是你能做的最好的事情。
或者,要查看所有已安装软件包的列表,请运行dpkg-query -W -f'${PackageSpec}\n'

只有root用户可以在Ubuntu下安装软件包,能够执行此操作的用户只有一个,即sudoers用户具有相同的权限。
然而,您可以通过查看日志来获取大量信息,您可以查看:
apt日志位于/var/log/apt/目录下 dpkg日志位于/var/log/目录下
并且您可以使用一个命令获取已安装软件包的列表:
dpkg -l | grep ii

你可以以任何方式重新表达我的问题,只要原始意思保持不变。如果它被称为“sudoers已安装的应用程序”,那就这样吧 :) 当然,我可以将我的问题改为“如何列出系统安装后安装的应用程序”。 “而且你可以获得已安装软件包的列表” - 用于什么目的? - Bucic
+1 对于 /var/log/apt。如果您使用 apt-get 安装了所有内容,则在此日志中搜索“命令行:”将为您提供手动安装的内容的清单。 - drevicko

实际上,根据您的问题,我看到以下命令可以满足您的需求:dpkg -l | grep ii。对于我来说,这将列出每个已安装的软件包。现在它没有显示用户A或用户B,但这是软件中心日志而不是sudo的限制。即使使用sudo,调用sudo的用户也会被传递,所以您仍然可以让任何应用记录调用sudo运行命令的用户。当然,您可以相对容易地绕过这一点,因为sudo的一部分功能是能够作为任何有sudo访问权限的用户登录,只要您知道他们的密码、破解它,或者如果您在系统上具有更改密码的权限。

如果您担心用户安装的软件可能会给您或您的系统带来风险,您可能需要审查一下为什么给予他们sudo访问权限以及安装软件包的能力,但这只是一个侧面的说明。

我有一种感觉您正在询问自己从系统安装以来安装了哪些软件包,以便进行清理或将设置复制到新机器上。这里已经有答案涵盖了备份/恢复,所以我们将跳过这个话题。

由于没有简单直接的方法来找出哪个用户调用了软件包的安装,更好的方法可能是使用上面列出的命令以及其他用户提供的命令来列出所有已安装的软件包,并打开一个浏览器窗口到Google并运行Google搜索,以确定哪些软件包是必需的以保持系统正常运行,哪些是不必要的。
跳过这里的废话,直接获取更直接的答案...
您还可以查看sudoers日志,以查看谁调用了安装什么的,请让我给出一个示例行。
May 15 11:26:30 <COMPUTERNAME> sudo:   <user who called sudo> : TTY=unknown ; PWD=/home/pariah (pwd file or auth method used to verify user) ; USER=root (User they were running as) ; COMMAND=/usr/bin/thunar (the command they ran)

所以这告诉我在此时间和日期,此用户调用了sudo [实际上在此情况下使用了gksu],sudo允许他们拥有权限的用户,以及他们运行的命令!

现在,如果你要在sudo日志[/var/log/auth.log]中搜索apt-get或类似内容,旧的日志会以.0 .1等结尾。

你可以通过拼凑命令行本身来确定用户调用的安装软件。如果他们使用了software-center,我不确定相关的终端命令是否会在此处生成授权行,但你可以使用以下位置找到software center的日志:

/var/log/apt/history.log,而旧的日志则保存在.gz压缩档案中。

现在,软件中心日志并没有提供授权安装的用户,至少在我看过的日志中没有,但它列出了软件中心执行的每个添加、修改或删除操作。同样,该日志也包含时间和日期戳,因此很容易找到基本系统安装完毕后的软件包,只需打开最旧的日志并向上滚动,或者如果你记得基本安装完成的时间和日期,那就没问题。

这两个提到的日志文件都是明文格式,你可以使用Ubuntu发行版默认的任何gedit、mousepad、leafpad或其他文本编辑器来查看或打印它们。