如何列出所有已安装的软件包及其 APT 原始主机名(而不是其原始标签)?

如何列出所有已安装的软件包及其 APT 原始主机名(而不是其原始标签)?

我正在尝试限制使用第三方 APT 存储库的风险。我试图防止的情况是,恶意软件包被引入第三方存储库,其版本比我从 Debian 安装的版本更新。

最近,每当我添加新的 APT 源时,我都会使用 APT 固定来仅从该源安装某些软件包,如下所示:

Package: *
Pin: origin debian.nabijaczleweli.xyz
Pin-Priority: -1

Package: systemd-zram
Pin: origin debian.nabijaczleweli.xyz
Pin-Priority: 500

请注意,我正在使用Pin: origin <hostname>而不是Origin: <tag>这样做。如果我理解正确的话,原始标签是由存储库本身(在发布文件中)控制的,并且可以很容易地debian被恶意或由于无知地设置为 。 (我在野外见过这种情况。)相比之下,源主机名是从 中指定的 URI 派生的sources.list

这似乎工作得很好,现在我想将其应用到我所有的第三方 APT 源。为此,我需要知道我从每个第三方存储库安装了哪些软件包。问题是,我似乎找不到一种方法来获取已安装软件包及其原始 URI 或主机名的列表。

Aptitude 很高兴向您展示Origin URI包裹信息屏幕1,但不包括搜索谓词对于它也不会显示它包裹清单

dpkg-query并且apt-cache可以给我很多关于包的信息,但是我还没有找到获取原始 URI 或主机名的方法。

我假设我可以使用文件名的第一部分作为原始主机名来解析自己的内容/var/lib/apt/lists/*_Packages,但我不希望自己受此影响。

所以:

  1. 这种情况值得考虑吗?也许受损的回购协议可以通过多种方式把我搞砸,所以我应该学会停止担心并热爱炸弹。

  2. 我是否正确地认为,Releases文件的Origin字段指示包来源的可靠性不如 中使用的原始主机名Pin: origin <hostname>

  3. 有没有办法获取所有已安装软件包及其原始主机名的列表?

谢谢!

¹该页面上的屏幕截图太旧,无法描述Origin-URI所显示的字段,但 Aptitude 的现代版本在此处显示了包的完整 URI。

答案1

aptitude对于你想要的逻辑来说似乎很愚蠢。

解决方法是求助于 Python:

import apt

CACHE = apt.Cache()

for pkg in CACHE:
    if not pkg.installed:
        continue
    for orig in pkg.candidate.origins if pkg.candidate else []:
        if len(orig.site) == 0:
            continue
        print(pkg, pkg.candidate.version, orig.site)

更新包装apt内含:

bash# dpkg -S /usr/lib/python3/dist-packages/apt/__init__.py
python3-apt: /usr/lib/python3/dist-packages/apt/__init__.py

相关内容