Descubra quais pacotes foram instalados após a instalação do sistema operacional

7

Como descubro quais pacotes foram instalados desde que o sistema operacional foi instalado ? Eu não quero saber todos os pacotes instalados, apenas aqueles que não faziam parte da instalação inicial do sistema operacional e foram explicitamente instalados posteriormente.

Para o bem desta questão, vamos assumir uma nova instalação, pois imagino que atualizações de distro complicariam as coisas. Eu preferiria usar a linha de comando, mas uma solução GUI seria OK se um comando ou script não estivesse disponível.

Eu dei uma rápida olhada nas man pages de dpkg e aptitude , mas não vi nada óbvio. Além disso, a saída de apt-cache show package-name ou dpkg -s pkg-name não parece fornecer nenhuma data que possa ser comparada com a data de instalação do SO (que eu teria que descobrir como obter também).

Eu tenho logwatch em um servidor que envia notificações diárias do que foi instalado. Meu palpite é que ele analisa o dpkg.log. Não tenho certeza se esse método seria uma solução, já que muitas das entradas de instalação podem ter sido finalizadas, especialmente em sistemas mais antigos. E, idealmente, isso deve funcionar para qualquer sistema, desktop ou servidor.

Também seria ótimo se a saída pudesse incluir a versão do pacote atualmente instalada, mas isso pode estar pedindo muito, e eu sempre posso fazer o script mais tarde assim que eu tiver os nomes dos pacotes.

    
por drgrog 12.05.2014 / 10:08

3 respostas

7

Todo o Ubuntu ISO ([UKLX] buntu / Ubuntu-gnome) vem com o arquivo .manifest que contém a lista de todos os pacotes pré-instalados no ISO. Você pode encontrar esses arquivos de manifesto no mesmo diretório de download como aqueles ISO em qualquer espelhamento do Ubuntu ISO. Pegue a lista de versões disponíveis do Ubuntu como um exemplo; se você tiver Trusty 64 bits, por exemplo, o link do manifesto seria link .

Então, quando você tiver este arquivo, apenas compare a lista de pacotes nele com a lista de todos os pacotes instalados no seu Ubuntu usando o comando comm

$ curl -O http://releases.ubuntu.com/trusty/ubuntu-14.04-desktop-amd64.manifest
$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
        <( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort )

Para explicar o que o comm faz, ele recebe entrada de 2 arquivos - primeiro um fornece a lista de todos os pacotes atualmente instalados e o segundo o arquivo de manifesto. O -3 opt suprime as linhas que ambos os arquivos têm e -2 suprime as linhas que somente o segundo arquivo (arquivo de manifesto, isto é) possui. Assim, no final, sua saída contém apenas linhas que apenas o arquivo que possui e que fornece pacotes que você instalou manualmente desde que o sistema operacional foi instalado.

Então você tem isso.

Editar

Se você também quiser ver a versão do pacote ao lado do nome do pacote na saída, como Slyvain Pineau apontou, canalize o comando comm acima para xargs dpkg-query -W -f='${binary:Package} ${Version}\n' para que se torne

$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
           <( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort ) | \
           xargs dpkg-query -W -f='${binary:Package} ${Version}\n

Ou, alternativamente, com awk inteiramente, Isso também dá o mesmo resultado que o comando acima

awk 'FNR==NR {arr[$1];next} !($1 in arr) { print $0 }' ubuntu-14.04-desktop-amd64.manifest <( dpkg-query -W -f='${binary:Package} ${Version}\n' )

Veja este link para obter explicações sobre como o awk cmd trabalho

    
por Flint 12.05.2014 / 12:17
3

O método initial-status.gz e dpkg-query do link dá a lista mais precisa e concisa para minhas necessidades.

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

Por que gosto disso e não dos outros:

O método de comparação de manifesto da resposta do Flint e de link inclui muitas dependências e outros pacotes possivelmente marcados como 'requeridos' e instalados automaticamente. Por exemplo, ele lista libvlc5 e vlc-data , enquanto o método acima apenas lista vlc .

O método history.log do link não listará todos os pacotes se os logs fizerem não voltar até o lançamento da instalação. Ele também contém muitos comandos upgrade que precisam ser filtrados.

O método dpkg --get-selections , que é uma resposta aceita de um pergunta semelhante, lista todos os pacotes e dependências, incluindo aqueles instalados com o lançamento. Não lista apenas aqueles instalados explicitamente.

    
por drgrog 12.05.2014 / 17:55
0

Um grande obrigado e parabéns para aqueles que criaram a gema de um roteiro !!!
Eu queria adicionar meu 2 ¢ e eu adicionei a data de instalação que deduzi de $ info.
Eu não dominei os detalhes porque os arquivos $ info são atualizados ou não e quando, mas funciona na prática.
Meu script lista as atualizações mais recentes de pacotes não dependentes adicionados após a instalação.
Dando uma checagem periódica, eu estava vendo o que teria logado manualmente sem uma única falha.
Ou seja, lotes de pacotes instalados pelo mesmo motivo. Infelizmente, as atualizações quebram esse pedido.
Após uma atualização do sistema, eu tinha uma lista dos meus pacotes adicionados que a atualização não atualizou, seguidos por aqueles que ela fez.
Arrumado! Aproveite.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*//') $n
done < /tmp/packages | sort
    
por Papou 25.05.2018 / 21:00