it-swarm.it

Elencare i pacchetti su un sistema basato su apt per data di installazione

Come posso elencare i pacchetti installati per data di installazione?

Devo farlo su debian/ubuntu. Anche le risposte per altre distribuzioni sarebbero belle.

Ho installato un sacco di cose per compilare un certo pezzo di codice e voglio ottenere un elenco dei pacchetti che dovevo installare.

106

Le distribuzioni basate su RPM come Red Hat sono facili:

rpm -qa --last

Su Debian e altre distribuzioni basate su dpkg, anche il tuo problema specifico è facile:

grep install /var/log/dpkg.log

A meno che il file di registro non sia stato ruotato, nel qual caso dovresti provare:

grep install /var/log/dpkg.log /var/log/dpkg.log.1

In generale, dpkg e apt non sembrano tenere traccia della data di installazione, a causa della mancanza di un tale campo nel dpkg-query pagina man.

E alla fine il vecchio /var/log/dpkg.log.* i file verranno eliminati mediante la rotazione del registro, quindi non è garantito che ti fornisca l'intera cronologia del tuo sistema.

Un suggerimento che appare alcune volte (ad es. questa discussione ) è guardare il /var/lib/dpkg/info directory. I file lì suggeriscono che potresti provare qualcosa del tipo:

ls -t /var/lib/dpkg/info/*.list | sed -e 's/\.list$//' | head -n 50

Per rispondere alla tua domanda sulle selezioni, ecco un primo passaggio.

crea un elenco di pacchetti per data

$ find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' | \
    sort > ~/dpkglist.dates

crea l'elenco dei pacchetti installati

$ dpkg --get-selections | sed -ne '/\tinstall$/{s/[[:space:]].*//;p}' | \
    sort > ~/dpkglist.selections

unisciti alle 2 liste

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.dates \
    > ~/dpkglist.selectiondates

Per qualche motivo non sta stampando molte differenze per me, quindi potrebbe esserci un bug o un'ipotesi non valida su ciò che --get-selections si intende.

Puoi ovviamente limitare i pacchetti sia usando find . -mtime -<days> o head -n <lines> e modifica il formato di output come preferisci, ad es.

$ find /var/lib/dpkg/info -name "*.list" -mtime -4 | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list$,,' | \
    sort > ~/dpkglist.recent

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.recent \
    > ~/dpkglist.recentselections

per elencare solo le selezioni installate (modificate?) negli ultimi 4 giorni.

Probabilmente potresti anche rimuovere i comandi sort dopo aver verificato l'ordinamento utilizzato da dpkg --get-selections e rendere più efficiente il comando find.

68
Mikel

Mikel ha mostrato come farlo a livello di dpkg . In particolare, /var/lib/dpkg/info/$packagename.list viene creato quando il pacchetto viene installato (e non modificato in seguito).

Se hai usato gli strumenti APT (cosa che hai presumibilmente fatto dal momento che sei preoccupato per i pacchetti installati automaticamente o installati), c'è una cronologia in /var/log/apt/history.log. Finché non si è allontanato, tiene traccia di tutte le APT, con un'annotazione per i pacchetti contrassegnati come installati automaticamente. Questa è una funzione abbastanza recente, introdotta in APT 0.7.26, quindi in Debian è apparso in compressione. In Ubuntu, 10.04 ha history.log ma l'annotazione installata automaticamente non è presente fino al 10.10.

Ruvido, ma funziona:

for fillo in `ls -tr /var/lib/dpkg/info/*.list` ; 
    do basename ${fillo} | sed 's/.list$//g' ; 
done > forens.txt

ls -ltr /var/lib/dpkg/info/*.list > forentime.txt

for lint in `cat forens.txt` ; do 
    echo -n "[ ${lint} Installed ] : " ; 
    echo -n "`grep /${lint}.list forentime.txt | awk '{ print $6, $7, $8 }'` : " ; 
    ( ( grep -A3 " ${lint}$" /var/lib/apt/extended_states | \
        grep '^Auto' > /dev/null ) && echo "Auto" ) || echo "Manual" ; 
done > pkgdatetime.txt
6
Dulantha

Il /var/log/apt/history.log Il file ha un formato IMHO scomodo.

Data di inizio: {data} {ora} Riga di comando: {comando} {opzioni ...} Installa: {pacchetto (versione)}, ..., {pacchetto (versione)}, ... Data di fine: {data } {tempo}

Avrei preferito un record formattato con più file di registro

{Data} {ora} {tab} {package} {tab} {version} {tab} {comando} {opzioni}\n

o alcuni XML che mostrano non solo un {pacchetto} ma qualsiasi {dipendenza}.

Come attualmente implementato, puoi scoprire le informazioni che cerchi ma richiede un'elaborazione forense per estrarre i dettagli.

4
Saint DanBert

Questo funziona per me su un sistema Debian, suppongo che il formato del file sia cambiato dal 2011. Questo sistema è abbastanza recente, quindi non mi aspetto che funzioni su un sistema più vecchio, anche se potrebbe richiedere solo decomprimere i log e usare un glob per riferirsi a tutti loro.

grep 'install ' /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d' '

I primi due campi in ciascuna riga del file /var/log/dpkg.log sono la data e l'ora. Nota lo spazio finale con installazione nella parte grep, questo perché gli aggiornamenti possono innescare installazioni ma se ho capito bene volevi sapere cosa è stato installato dagli utenti.

3
Amias

Ecco il one-liner che tutti vogliono e di cui hanno bisogno:

for x in $(ls -1t /var/log/dpkg.log*); do zcat -f $x |tac |grep -e " install " -e " upgrade "; done |awk -F ":a" '{print $1 " :a" $2}' |column -t

Il risultato mostrerà tutti i pacchetti (di recente) installati e aggiornati in ordine cronologico ordine.

La spiegazione della riga:

  • ls -1t - prendi tutto dpkg.log* nomi dei file in ordine cronologico
  • zcat -f - SE IL FILE è del tipo gzip quindi decomprimilo, - ELSE passa il contenuto.
  • tac - Uscita inversa di cat , riga per riga per assicurarci di ottenere l'ordine cronologico corretto.
  • grep - Controlla solo i pacchetti installati o upgrade .
  • awk -F ':a' - Separa il campo architecture dal nome del pacchetto
  • column -t - stampa piuttosto le colonne separate da spazio

Si vorrebbe ovviamente creare un alias per questo, ma sfortunatamente non è possibile in quanto awk dipende dalle virgolette singole e doppie. A questo proposito è meglio metterlo in uno script bash e dove il : il separatore viene gestito meglio per altre architetture nella colonna del campo.

L'output è:

2018-03-06  18:09:47  upgrade  libgomp1                     :armhf  6.3.0-18+rpi1                 6.3.0-18+rpi1+deb9u1
2018-03-05  15:56:23  install  mpg123                       :armhf  <none>                        1.23.8-1
2018-03-05  15:56:23  install  libout123-0                  :armhf  <none>                        1.23.8-1
2018-01-22  17:09:45  install  libmailtools-Perl            :all    <none>                        2.18-1
2018-01-22  17:09:44  install  libnet-smtp-ssl-Perl         :all    <none>                        1.04-1

Restituzione:

  • Come mostrato sopra, funziona solo su ARM architettura e necessita di lievi modifiche per il separatore di campi di architettura
  • Deve essere inserito in uno script per un semplice alias
  • Non è stato testato su altri sistemi * nix
2
not2qubit

GNU/Linux Debian non ha strumenti integrati per questo problema, ma tutte le informazioni sui programmi installati in modo standard sono salvate in file con nome-programma.list nella posizione /var/lib/dpkg/info/. Ma non ci sono informazioni sui programmi installati manualmente lì.


na soluzione a riga singola lunga:

for file_list in `ls -rt /var/lib/dpkg/info/*.list`; do \
    stat_result=$(stat --format=%y "$file_list"); \
    printf "%-50s %s\n" $(basename $file_list .list) "$stat_result"; \
done

Spiegazione:

  1. ls -rt genera i file ordinati per modifica della data in ordine inverso, cioè con i file più recenti alla fine dell'elenco.
  2. stat stampa la data del file in forma leggibile.
  3. printf visualizza il nome del pacchetto e la data dell'ultima modifica.
  4. Il ciclo for nel suo insieme stampa i nomi e le date dei pacchetti dal più vecchio al più recente.

Esempio di output (troncato):

.........................................
gnome-system-log                            2016-09-17 16:31:58.000000000 +0300
libyelp0                                    2016-09-17 16:32:00.000000000 +0300
gnome-system-monitor                        2016-09-17 16:32:00.000000000 +0300
Yelp-xsl                                    2016-09-17 16:32:01.000000000 +0300
Yelp                                        2016-09-17 16:32:03.000000000 +0300
gnome-user-guide                            2016-09-17 16:32:18.000000000 +0300
libapache2-mod-dnssd                        2016-09-17 16:32:19.000000000 +0300
.........................................
linux-compiler-gcc-4.8-x86                  2017-02-26 20:11:02.800756429 +0200
linux-headers-3.16.0-4-AMD64                2017-02-26 20:11:10.463446327 +0200
linux-headers-3.16.0-4-common               2017-02-26 20:11:17.414555037 +0200
linux-libc-dev:AMD64                        2017-02-26 20:11:21.126184016 +0200
openssl                                     2017-02-26 20:11:22.094098618 +0200
unzip                                       2017-02-26 20:11:23.118013331 +0200
wireless-regdb                              2017-02-26 20:11:23.929949143 +0200
nodejs                                      2017-02-26 20:11:33.321424052 +0200
nasm                                        2017-02-28 16:41:17.013509727 +0200
librecode0:AMD64                            2017-03-01 10:38:49.817962640 +0200
libuchardet0                                2017-03-01 10:41:10.860098788 +0200
tree                                        2017-03-04 14:32:12.251787763 +0200
libtar0                                     2017-03-07 09:51:46.609746789 +0200
libtar-dev                                  2017-03-07 09:51:47.129753987 +0200

Il principale difetto di questa soluzione è che non è ben testato in produzione.

1
PADYMKO

È approssimativo, ma funziona rapidamente come altre soluzioni. Il formato della data è yyyymmddhhmmss, il che significa che un po 'o il riordino e la rimozione del formato danno come risultato un numero che può essere ordinato.

Mille grazie alle altre soluzioni, questo elenco elenca i nomi dei pacchetti in ordine di installazione che potrebbero essere utilizzati in un sistema operativo creato per creare copie.

find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; \
| sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' \
| sort | awk '{print $2$3" "$1}' | sed '0,/RE/s/-//' \
| sed '0,/RE/s/-//' | sed '0,/RE/s/://' | sed '0,/RE/s/://' \
| sed '0,/RE/s/\\.//' | sed 's/:armhf//' | sort | awk '{print $2}'
1
Alexander Cave

Notando questo perché dici che altre risposte alla distribuzione sono benvenute. rpm ha un ampio set di tag di formato di output, uno dei quali è INSTALLTIME. (Usando wget come esempio)

rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1
wget,1454014156

Questo può essere formattato in alcuni modi. Lo uso in questo modo:

rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1
wget,Thu 28 Jan 2016 03:49:16 PM EST

Queste due pagine contengono moltissime informazioni sulla risoluzione dei problemi relativi ai metadati RPM:

http://www.rpm.org/max-rpm/s1-rpm-query-parts.html

http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html

Ordinare queste informazioni ti darebbe una soluzione funzionante per il tuo problema.

1
Jonathan Swift