Como posso recursivamente listar as dependências de um pacote apt com suas versões instaladas?

6

Eu gostaria de listar as dependências recursivas de um determinado pacote, com a versão atualmente instalada de cada dependência. Eu também gostaria de uma entrada em cada linha, por isso é classificável e diffable.

Basicamente, digamos que tcpdump gostaria que a saída se parecesse com:

libtext-wrapi18n-perl: 0.06-7
perl-base: 5.14.2-21+deb7u2

... etc. O formato exato de cada linha não importa muito, apenas a capacidade de diferenciar e ordenar.

A questão Listar dependências (recursivas) do Os pacotes instalados no APT são semelhantes, mas não fornecem versões de pacotes. Usar debfoster -d parece promissor, mas sua saída não se presta a processamento adicional.

    
por detly 09.03.2015 / 02:59

3 respostas

6

Ambas as respostas já fornecidas têm seus prós e contras.

Começando com debfoster , é apresentada uma lista de pacotes que é simples de analisar, de modo que o seguinte forneça o resultado solicitado:

apt-cache policy $(debfoster -q -d tcpdump|tail -n +2)|awk '/^[^ ]/ { package=$0 } /  Installed/ { print package " " $2 }'

usando tail para pular a primeira linha e awk para processar o resultado em uma única operação. (Usar uma substituição de comando evita a necessidade de processar novas linhas.) Começando com debfoster significa que só podemos fazer isso com um pacote que já está instalado, então podemos usar dpkg para fornecer mais informações:

dpkg -l $(debfoster -q -d tcpdump|tail -n +2)

Começando com apt-rdepends , fornece uma lista de pacotes que é um pouco mais difícil de processar, com duplicatas; mas tem a vantagem de poder processar pacotes que ainda não estão instalados:

apt-cache policy $(apt-rdepends -p tcpdump 2>| /dev/null|awk '/Depends/ {print $2}'|sort -u)|awk '/^[^ ]/ { package=$0 } /  Installed/ { print package " " $2 }'

Isso também pode ser usado com dpkg -l :

dpkg -l $(apt-rdepends -p tcpdump 2>| /dev/null|awk '/Depends/ {print $2}'|sort -u)

mas isso requer que dpkg saiba sobre todos os pacotes envolvidos, o que pode não ser o caso se o pacote que está sendo processado não estiver instalado.

debfoster inclui Recommends por padrão; isso pode ser desativado usando --option UseRecommends=no :

debfoster -q --option UseRecommends=no -d tcpdump

apt-rdepends não inclui Recommends por padrão; isso pode ser ativado usando -f Depends,PreDepends,Recommends -s Depends,PreDepends,Recommends :

apt-rdepends -f Depends,PreDepends,Recommends -s Depends,PreDepends,Recommends -p tcpdump

embora não forneça todas as dependências debfoster encontradas nesse caso. (Por exemplo, debfoster descobre que tcpdump depende de apt via libssl1.0.0 , debconf e apt-utils , mas apt-rdepends não.)

    
por 09.03.2015 / 09:04
2

O seguinte conjunto de comandos parece ser o seguinte:

debfoster -q -d tcpdump |
 sed -n '1!p' |
 tr -s ' ' |
 xargs |
 tr '\n' ' ' |
 xargs -I _ -d ' ' -n 1 sh -c "echo  _: \"\$(apt-cache policy _ | grep '  Installed: ' | sed -e 's/  Installed: //')\""

Isso usa:

  • debfoster para imprimir as dependências (recursivas)
  • sed para remover a primeira linha
  • tr para recolher espaços extras
  • xargs para aparar espaço inicial e final
  • tr para remover a nova linha à direita
  • xargs para:
    • echo o nome do pacote
    • use apt-cache policy para encontrar a versão instalada (juntamente com grep e sed para extrair a versão em si.

Produz:

apt-utils: 1.0.1ubuntu2.6
debconf: 1.5.51ubuntu2
debconf-i18n: 1.5.51ubuntu2
dpkg: 1.17.5ubuntu5.3
gcc-4.8-base: 4.8.2-19ubuntu1
[...etc...]

Se alguém puder ver uma maneira de simplificar isso, me avise.

    
por 09.03.2015 / 06:14
2

O pôster escreve (em um comentário):

I want all packages that tcpdump depends upon, and all of their dependencies, and all of their dependencies, etc.

apt-rdepends faz isso. NOTA: o "r" em "rdepends" significa "recursivo".

apt-rdepends -p tcpdump
Reading package lists... Done
Building dependency tree       
Reading state information... Done
tcpdump
  Depends: libc6 (>= 2.7) [Installed]
  Depends: libpcap0.8 (>= 1.0.0) [Installed]
  Depends: libssl0.9.8 (>= 0.9.8m-1) [NotInstalled]
libc6
  Depends: libc-bin (= 2.11.3-4) [Installed]
  Depends: libgcc1 [Installed]
libc-bin
libgcc1
  Depends: gcc-4.4-base (= 4.4.5-8) [NotInstalled]
  Depends: libc6 (>= 2.2.5) [Installed]
gcc-4.4-base
libpcap0.8
  Depends: libc6 (>= 2.7) [Installed]
libssl0.9.8
  Depends: debconf (>= 0.5) [Installed]
  Depends: debconf-2.0 [NotInstalled]
  Depends: libc6 (>= 2.7) [Installed]
  Depends: zlib1g (>= 1:1.1.4) [Installed]
debconf
  Depends: debconf-english [NotInstalled]
  Depends: debconf-i18n [Installed]
  PreDepends: perl-base (>= 5.6.1-4) [Installed]
debconf-english
  Depends: debconf [Installed]
debconf-i18n
  Depends: debconf [Installed]
  Depends: liblocale-gettext-perl [Installed]
  Depends: libtext-charwidth-perl [Installed]
  Depends: libtext-iconv-perl [Installed]
  Depends: libtext-wrapi18n-perl [Installed]
liblocale-gettext-perl
  Depends: libc6 (>= 2.2.5) [Installed]
  PreDepends: perl-base (>= 5.10.0-25) [Installed]
  PreDepends: perlapi-5.10.0 [NotInstalled]
perl-base
  PreDepends: dpkg (>= 1.14.20) [Installed]
  PreDepends: libc6 (>= 2.4) [Installed]
dpkg
  PreDepends: coreutils (>= 5.93-1) [Installed]
  PreDepends: libbz2-1.0 [Installed]
  PreDepends: libc6 (>= 2.6) [Installed]
  PreDepends: libselinux1 (>= 1.32) [Installed]
  PreDepends: xz-utils [Installed]
  PreDepends: zlib1g (>= 1:1.1.4) [Installed]
coreutils
  PreDepends: libacl1 (>= 2.2.11-1) [Installed]
  PreDepends: libattr1 (>= 2.4.41-1) [Installed]
  PreDepends: libc6 (>= 2.6) [Installed]
  PreDepends: libselinux1 (>= 1.32) [Installed]
libacl1
  Depends: libattr1 (>= 2.4.41-1) [Installed]
  Depends: libc6 (>= 2.2.5) [Installed]
libattr1
  Depends: libc6 (>= 2.2.5) [Installed]
libselinux1
  Depends: libc6 (>= 2.3.4) [Installed]
libbz2-1.0
  Depends: libc6 (>= 2.3) [Installed]
xz-utils
  Depends: libc6 (>= 2.6) [Installed]
  Depends: liblzma2 (>= 5.0.0) [NotInstalled]
liblzma2
  Depends: libc6 (>= 2.2.5) [Installed]
zlib1g
  Depends: libc6 (>= 2.2.5) [Installed]
perlapi-5.10.0
libtext-charwidth-perl
  Depends: libc6 (>= 2.2.5) [Installed]
  Depends: perl-base (>= 5.10.0-13) [Installed]
  Depends: perlapi-5.10.0 [NotInstalled]
libtext-iconv-perl
  Depends: libc6 (>= 2.2.5) [Installed]
  Depends: perl-base (>= 5.10.0-13) [Installed]
  Depends: perlapi-5.10.0 [NotInstalled]
libtext-wrapi18n-perl
  Depends: libtext-charwidth-perl [Installed]
debconf-2.0
    
por 09.03.2015 / 05:25