Debian 기반 시스템에 설치된 모든 패키지의 소스 찾기

Debian 기반 시스템에 설치된 모든 패키지의 소스 찾기

나는 쉽게 구문 분석할 수 있는 내 시스템에 저장된 모든 패키지의 저장소를 찾는 좋은 방법을 찾으려고 노력하고 있습니다.

배경 이야기:

나는 Debian wheezy 시스템을 가지고 있고 최신 버전의 패키지를 얻을 수 있도록 wheezy-backports 저장소를 설정했습니다. 고정 구성에서 모드를 잘못 썼는데 눈치채지 못했어요. 백포트 저장소를 수정했습니다 *. 몇 주 후에 저는 apt-get -y dist-upgrade눈치채지 못한 채 하나를 출시했고 관심이 있었던 wheeze 백포트로 더 많은 패키지를 업그레이드했습니다.

콘텐츠를 쉽게 복원할 수 있도록 백업이 있지만 이 상황에서는 각 패키지가 어느 저장소에서 왔는지 알아내는 방법을 꼭 찾고 싶습니다.

지금까지 내가 찾은 가장 가까운 방법은 이것이다. apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' ). 이것은 약간 가깝지만 이상적으로는 모든 패키지에 대해 이러한 보고서를 얻고 싶습니다.

Package<tab>Version<tab>Origin<tab>Suite

여기서 Origin/Suite는 저장소 릴리스 파일의 값입니다.

답변1

다음 Python 스크립트는 출력을 구문 분석 apt-cache policy하고 출력 형식으로 설치된 모든 패키지 목록을 생성합니다.

Package<tab>Version<tab>Origin<tab>Suite

적절한-쇼-기원 apt-쇼-기원

#!/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

노트:

  • 반대로 댓글에 apt-show-versions남아있는 내용은 확인해주세요공식 메일링 리스트. 하지만 패키지의 소스를 출력하지 않기 때문에 도움이 되지 않습니다.

답변2

이 질문을 게시한 지 꽤 시간이 지났습니다. 어쨌든 몇 년 전에 시스템에 설치된 추가/오래된/외부 패키지를 찾는 근본적인 문제를 해결하는 도구가 추가되었습니다.

이 명령은 apt-forktracer소프트웨어 패키지로 제공됩니다. 실행하면 기본적으로 현재 설치된 버전이 아닌 모든 패키지가 표시됩니다.

https://packages.debian.org/stable/apt-forktracer

관련 정보