1

我的任务是识别安装在几台 Red Hat Enterprise Linux (RHEL) 机器上的新(非操作系统)软件。谁能建议一种有效的方法来做到这一点?我这样做的方式是手动将已安装软件的列表与 Red Hat FTP 站点上相关操作系统的列表进行比较:

ftp://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/

我在使用这种方法时遇到的问题是它很乏味/耗时,而且只列出了源包(例如,我不知道 avahi-glib 是否作为 avahi 包的一部分安装)。如果有人可以提出一种更有效的方法来识别 RHEL 机器上的操作系统未附带的软件,我们将不胜感激!

这是我迄今为止提出的一种更有效的方法(尽管我还没有弄清楚最后一部分,并且可能有更有效的方法)。如果有人可以帮助我完成此方法的最后一步,或者可以分享更好的方法,将不胜感激!

新方法(正在进行中):

  1. 将 Red Hat 的 FTP 站点中的软件包列表复制到一个文本文件 (OSPackages.txt) 中。

  2. 要解决仅列出源 RPM 的问题,请将http://vault.centos.org中相关相应版本的文件列表复制到文本文件中,并将此数据与 OSPackages.txt 合并。

  3. 执行 rpm -qa > list1, yum -y list installed > list2, ls /usr/bin > list3, ls /usr/share > list4, ls /usr/lib > list5。

  4. 使用 cat 将所有 listX 文件合并到 InstalledPackages.txt 中。

  5. 使用 sort 对唯一条目进行排序,例如: sort -u -k 1 InstalledPackages.txt > SortedInstalledPackages.txt

  6. 使用正则表达式 (-I regexp) 在 SortedInstalledPackages.txt 和 OSPackages.txt 之间进行比较,以识别包名称(并消除版本号)。我还需要做一个“单向差异”,例如忽略 OSPackages.txt 中未出现在已安装包文件中的额外操作系统包。

注意:我问了以下问题来帮助我完成这部分,并且相信我现在已经非常接近解决方案: 如何在 Linux 中进行单向差异?

如果 diff (或其他命令)可以执行最后一步,它应该生成一个不在操作系统上的软件包列表。这是我坚持的步骤,希望得到进一步的帮助。我将使用什么命令来执行第 6 步?

4

4 回答 4

5

rpm -qa --last | less

这将列出最近安装的 rpm 以及安装日期。

于 2013-07-18T19:03:19.927 回答
1

yum 提供了一些关于安装包的时间和位置的有用信息。如果您有系统安装日期,那么您可以提取之后安装的软件包,以及从不同来源和位置安装的软件包。

从另一个方向来看,您可以查询 rpm 以找出哪些包提供了 /sbin /lib 等中的每个二进制文件...... - 任何不提供“系统”二进制文件或库的包都是您初始文件的一部分供考虑。

于 2013-06-26T13:09:35.687 回答
1

获取已配置存储库 ID 的列表:

yum repolist | tail -n +3 | grep -v 'repolist:' | cut -f1 -d' '

现在确定哪些是有效的 Red Hat 存储库。完成后,您可以列出该存储库中的所有包。例如,如果我要为 Fedora 官方存储库执行此操作,我会像这样获取包名称:

yum list installed  --disablerepo="*" --enablerepo="fedora*"

从此列表中,您可以获得已安装的软件包。

for p in $PACKAGES; do rpmls $p; done

或者像这样:

yum list installed   --disablerepo="*" --enablerepo="fedora*" \
 | cut -f1 -d' ' \
 | ( while read p; do rpmls $p; done ) \
 | cut -c13-

所以有一个应该来自官方存储库的文件列表。

现在您可以使用以下命令列出所有已安装的文件rpm

rpm -qal

有了这两个列表,就很容易比较两个输出的内容。

于 2014-01-24T19:46:52.720 回答
1

如果 redhat 在 Ubuntu 系统上具有 /var/log/installer/initial-status.gz 的等效项,那么您可以将其添加到 tmpfile 中,然后搜索已安装的软件包并 grep -v tmpfile。

我为学习 Linux 而编写的第一个脚本之一在 Ubuntu 上做了同样的事情:

https://gist.github.com/sysadmiral/d58388e315a6c6384053aa6b0af66c5f

这适用于 Ubuntu,并且可能适用于其他基于 Debian 的系统或使用 aptitude 包管理器的系统。它在 Redhat/CentOS 上不起作用,但我想我在这里添加它作为起点。

免责声明:它不会拾取手动编译的东西,即你的包管理器需要知道它才能让这个脚本显示它。

个人免责声明:请原谅不使用 tee。当我写这篇文章时,我还在学习绳索,并且从未为了怀旧而更新代码。

于 2014-06-04T14:28:59.410 回答