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

Come posso elencare i pacchetti installati per data di installazione?

Ho bisogno di farlo su debian / ubuntu. Anche le risposte per altre distribuzioni sarebbero carine.

Ho installato molte cose per compilare un certo pezzo di codice e voglio ottenere un elenco dei pacchetti che ho dovuto installare.

Commenti

Risposta

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, data la mancanza di tali campi nella dpkg-query pagina man.

E alla fine i vecchi file /var/log/dpkg.log.* verranno eliminati dalla rotazione del log, quindi non è così ” Non ti garantisco di darti lintera cronologia del tuo sistema.

Un suggerimento che appare alcune volte (es questo thread ) è quello di esaminare la directory /var/lib/dpkg/info. 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 lelenco dei 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 lelenco dei pacchetti installati

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

unisciti ai 2 elenchi

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

Per qualche motivo ” non stampa molte differenze per me, quindi potrebbe esserci un bug o un presupposto non valido su cosa significa --get-selections.

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

$ 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 lordinamento utilizzato da dpkg --get-selections e impostare find comando più efficiente.

Commenti

  • Di solito mi piace apt-get più di rpm, ma ora debian ottiene -1 per non aver salvato la data di installazione nel database. Il trucco Debian include tutti i pacchetti installati, non solo i pacchetti selezionati , ma ‘ un buon inizio.
  • Per Debian tu ottieni meno cruft (rimuove le voci half-installed) se lo fai: grep install\ /var/log/dpkg.log
  • @Mikel – Ottima risposta. Ho ampliato le ‘ raccogliere /var/lib/dpkg/info/*.list informazioni sul file ‘ e ho aggiunto il codice per filtrare tutto ma i ” pacchetti di primo livello ” (pacchetti atp da cui nessun altro pacchetto atp dipende). Quel < askubuntu.com/a/948532/723997> post risponde alla domanda ” Come posso visualizzare la cronologia dei comandi di apt-get install che ho eseguito manualmente? “.
  • Debian / Ubuntu: grep " install " /var/log/dpkg.log elenca solo le righe di “installazione” invece di mostrare anche quelle di “stato”.
  • Se né apt né dpkg store installano / modificano datetime, questo mi sembra piuttosto inaccettabile nel 2019. Abbiamo fatto affidamento su file di log grepping che potrebbero o non essere ancora sulla macchina? Comè questo il caso?

Risposta

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 utilizzato gli strumenti APT (cosa che presumibilmente hai fatto da quando ” sei preoccupato per i pacchetti installati automaticamente rispetto a quelli installati manualmente), cè “una cronologia in /var/log/apt/history.log. Finché non viene ruotato, tiene traccia di tutte le installazioni, aggiornamenti e rimozioni di APT, con unannotazione per i pacchetti contrassegnati come installati automaticamente. Questa è una caratteristica abbastanza recente, introdotta in APT 0.7.26, quindi in Debian è apparso in squeeze. In Ubuntu, 10.04 contiene history.log ma lannotazione installata automaticamente non è presente fino al 10.10.

Commenti

  • As Mikel ha sottolineato: ” E alla fine i vecchi file /var/log/dpkg.log.* verranno eliminati dalla rotazione del log, quindi in questo modo non ‘ garantisce di darti lintera cronologia del tuo sistema. “. Visualizza questo < askubuntu.com/a/948532/723997 > risposta su come rilevare gli attuali pacchetti di primo livello (ovvero quelli da cui nessun altro pacchetto dipende)

Risposta

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 

Commenti

  • Boo, sibilo per lanalisi delloutput da ls. Vedi mywiki.wooledge.org/ParsingLs per note sul motivo per cui questo è pericoloso / intrinsecamente difettoso: lopzione più sicura è utilizzare find -printf o stat --format per generare uno stream che può essere analizzato in modo univoco.
  • @CharlesDuffy Bel collegamento, ma per motivi di semplicità, utilizzando ls -al --time-style=long-iso dovrebbe essere utile. Inoltre, è probabilmente inaudito che qualcuno possa chiamare un pacchetto APT con \n\t\r\v nel nome.

Risposta

Ecco la frase 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 installati e aggiornati (appena) in ordine cronologico.

La spiegazione della riga:

  • ls -1t – ottieni tutti i dpkg.log* nomi di file in ordine cronologico
  • zcat -f SE file è di tipo gzip quindi decomprimilo, ELSE si limita a trasmettere il contenuto.
  • tac – Uscita inversa di cat , riga per riga per assicurarci di ottenere lordine cronologico corretto.
  • grep – Controlla solo installato o aggiorna i pacchetti.
  • awk -F ":a" – Separa il campo architettura dal nome del pacchetto
  • column -t – stampa carina le colonne separate da spazio

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

Loutput è:

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 

Svantaggio:

  • Come mostrato sopra, funziona solo su architettura ARM e necessita di una leggera modifica per il separatore di campo dellarchitettura
  • Deve essere inserito in uno script per un facile alias
  • Non è stato testato su altri sistemi * nix

Risposta

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

Data di inizio: {date} {ora } Riga di comando: {comando} {opzioni …} Installa: {pacchetto (versione)}, …, {pacchetto (versione)}, … Data di fine: {date} {ora}

Avrei preferito un record formattato come file di log

{date} {time} {tab} {package} {tab} {version} {tab} {command} {options} \ n

o un codice XML che mostra non solo un { package} ma qualsiasi {dipendenze}.

Come attualmente implementato, c e scoprire le informazioni che cerchi, ma per estrarre i dettagli è necessaria unelaborazione forense.

Risposta

Questo funziona per me su un Sistema Debian, immagino che il formato del file sia cambiato dal 2011. Questo sistema è abbastanza nuovo quindi non mi aspetterei che funzioni su un sistema più vecchio, anche se ciò potrebbe richiedere solo la decompressione dei log e luso di un glob per fare riferimento a tutti di loro.

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

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

Commenti

  • Esattamente quello che faccio. Facile. Ma puoi usare zgrep e tutti i tuoi log .gz verranno cercati come zgrep ‘ install ‘ /var/log/dpkg.log *.Posiziona lo spazio prima della parola ” install ” per evitare quelle fastidiose ” mezze installazioni “. Ho dovuto usare cut -f1,5 per ottenere il campo del nome del pacchetto. Ovviamente alla fine i vecchi log ruotano fuori.

Risposta

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


Una 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 restituisce file ordinati per modifica della data in ordine inverso, ie con i file più recenti alla fine dellelenco.
  2. stat stampa il file “s data in formato leggibile.
  3. printf mostra il nome del pacchetto e la data della sua ultima modifica.
  4. Il for il ciclo nel suo insieme stampa i nomi dei pacchetti e le date 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 difetto principale di questa soluzione è che “non è ben testato nel prodotto ion.

Commenti

  • Questa è una bella soluzione che porta quasi a termine il lavoro. Gli unici inconvenienti sono ‘, che (1) è ‘ molto lento e (2) che viene visualizzato solo quando un pacchetto è stato aggiornato lultima volta , nessuna delle versioni precedenti di ‘. Questo, ovviamente, non è un problema di una riga, ma come dpkg non ‘ tiene traccia della cronologia in /var/lib/dpkg/info/. Questo è anche il motivo per cui potrebbe essere preferibile utilizzare /var/log/dpkg.log*.

Risposta

Notando questo perché dici che altre risposte di distribuzione sono benvenute. rpm ha un ampio set di tag per il 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 diversi 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 un sacco di ottime 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 fornirebbe una soluzione funzionante per il tuo problema.

Risposta

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

Molte grazie alle altre soluzioni, questo elenca i nomi dei pacchetti in ordine di installazione che potrebbero essere usati in un sistema operativo creato per copiare.

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}" 

Commenti

  • Benvenuto @ alexander-cave! Aggiungi alcune righe di output in modo che le persone possano vedere che tipo di output aspettarsi.

Risposta

Con i file di log ruotati in apt puoi:

zcat -f /var/log/dpkg.log* | grep " install " | less 

Answer

Lho ottenuto su Kubuntu con i seguenti comandi:

  1. Elenca i pacchetti.
  2. leggi ogni input standard.
  3. memorizza lintero percorso (percorso | data di creazione) con il formato “% n |% y ” in una variabile.
  4. memorizza il nome del file in una variabile
  5. se entrambi i comandi precedenti sono stati eseguiti correttamente, i valori verranno stampati in una singola riga.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done 

Cordiali saluti,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *