在基于 Debian 的系统上查找所有已安装软件包的来源

Zor*_*che 5 debian dpkg apt

我试图找到一种很好的方法来为存储在我的系统上的每个包找到可以轻松解析的存储库。

背景故事:

我有 Debian wheezy 系统并设置了 wheezy-backports 存储库,因此我可以获得更新版本的软件包。我在固定配置中犯了一个错误,我没有注意到。我*为 backports 存储库固定。几周后,我发布了一个apt-get -y dist-upgrade并没有引起注意,而是将更多的软件包升级到了我感兴趣的 wheezy-backports。

我有备份,所以我可以轻松地轻松恢复东西,但是这种情况让我真的很想找到一种方法来找到每个包来自哪个存储库。

关于我迄今为止发现的最接近的方法是这样的。 apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' ). 这有点接近,但理想情况下,我希望为所有包获得这样的报告。

Package<tab>Version<tab>Origin<tab>Suite
Run Code Online (Sandbox Code Playgroud)

其中 Origin/Suite 是存储库发布文件中的值。

Ort*_*kni 10

以下python脚本解析输出apt-cache policy并生成所有已安装包的列表,输出格式

Package<tab>Version<tab>Origin<tab>Suite
Run Code Online (Sandbox Code Playgroud)

apt-show-origins

#!/usr/bin/env python

# Should be written with python-apt
# but for now parse the output of apt-cache policy

import os
import re
command    = "apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' )"
stream     = os.popen(command);
content    = stream.readlines()
getOrigin  = False
pkgList    = []

#Parse the output generated by apt-cache
for s in content:
  if(not s.startswith(' ')):
    pkg = type('', (), {})()   #Create an empty object 
    pkg.name = s[:-2]          #Remove trailing ':\n'
  elif(getOrigin):
    pkg.origin = re.split('\s+',s)[2]
    pkg.suite = re.split('\s+',s)[3]
    pkgList.append(pkg)
    getOrigin = False
  elif(s.startswith(' ***')):
    pkg.version = re.split('\s+',s)[2]
    getOrigin = True

#Display the list
for pkg in pkgList:
  print pkg.name    + '\t'\
      + pkg.version + '\t'\
      + pkg.origin  + '\t'\
      + pkg.suite
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 相反,评论中所说的apt-show-versions仍然保留,请查看官方邮件列表。但它无济于事,因为它不输出包的来源。