在Debian上,如何根据特定存储库中的软件包来审计已安装的软件包?

我pipe理许多Debian服务器,通常跟踪Debian稳定版本库,但偶尔会从Debiantesting版本库或第三方来源安装。 出于审计的目的,在每台机器上,对于当前安装的所有软件包,我想比较一下已安装的软件包版本与特定存储库(即Debian稳定版本库)中的软件包版本。

使用aptitudesearch模式,我可以从Debian稳定版本库中识别出已安装的软件包:

aptitude search "?installed?origin(Debian)?archive(stable)" aptitude search "?installed?not(?origin(Debian)?archive(stable))" 

但是对于Debian稳定版本库中的软件包,我无法确定安装的版本是否与版本库中的版本匹配。

我想可以使用apt钉来强制降级:

 Package: * Pin: release n=stable, o=Debian Pin-Priority: 1001 

然后使用空运行模式来检查哪些软件包会受到影响:

 apt-get update apt-get --dry-run upgrade 

但是,减轻使用apt超过1000的风险需要对apt进行单独的configuration,这似乎比需要更复杂。

今后可能会build立一个私有存储库,只能从Debian稳定版本库或私有存储库进行安装。 然后,如果一个软件包可以从私有存储库中获得,那么可以假定(为了审计目的)没有从Debian稳定版本库中安装。 只要软件包从不手动安装,这可以很好地工作。 但是build立一个私有的存储库似乎有点矫枉过正,可能是一个简单的命令。

有没有更好的方法来审计软件包版本? 甚至更好,审计包签名?

像这样:

 aptitude search "?installed?not(?narrow(?installed,?origin(^Debian$)?archive(^stable$)))" 

使用?narrow比较软件包名称版本,因此上面比较了已安装的软件包名称和版本与Debian稳定存储库中的软件包名称和版本,然后反转匹配以find与Debian稳定存储库中版本不匹配的已安装软件包。

Danila Ladner的意见也是有帮助的; 我将aptitude命令的结果提供给apt-cache policy <package> ,以便查看初始search中出现的软件包的版本详细信息,并且需要仔细查看。