Vis pakker på et apt-baseret system efter installationsdato

Hvordan kan jeg liste installerede pakker efter installationsdato?

Jeg skal gøre dette på debian / ubuntu. Svar på andre distributioner ville også være rart.

Jeg installerede en masse ting til at kompilere et bestemt stykke kode, og jeg vil gerne have en liste over de pakker, som jeg var nødt til at installere.

Kommentarer

Svar

RPM-baserede distributioner som Red Hat er lette:

rpm -qa --last 

På Debian og andre dpkg-baserede distributioner er dit specifikke problem også let:

grep install /var/log/dpkg.log 

Medmindre logfilen er roteret, skal du i så fald prøve:

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

Generelt synes dpkg og apt ikke at spore installationsdatoen, idet der mangler noget sådant felt i dpkg-query man-side.

Og til sidst vil gamle /var/log/dpkg.log.* filer blive slettet ved logrotation, så den måde ikke er ” garanterer ikke at give dig hele systemets historie.

Et forslag, der vises et par gange (f.eks denne tråd ) er at se på /var/lib/dpkg/info -mappen. Filerne der antyder, at du måske prøver noget i retning af:

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

For at besvare dit spørgsmål om valg, her “er det første pass.

build-liste over pakker efter datoer

$ 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 

build-liste over installerede pakker

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

Deltag i de 2 lister

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

Af en eller anden grund er det ” s udskriver ikke meget forskelle for mig, så der kan være en fejl eller en ugyldig antagelse om, hvad --get-selections betyder.

Du kan selvfølgelig begrænse pakkerne enten ved at ved hjælp af find . -mtime -<days> eller head -n <lines>, og skift outputformatet, som du vil, f.eks.

$ 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 

for kun at liste over de valg, der var installeret (ændret?) i de sidste 4 dage.

Du kunne sandsynligvis også fjerne kommandoerne sort efter verificering af sorteringsrækkefølgen brugt af dpkg --get-selections og lav find kommando mere effektiv.

Kommentarer

  • Jeg kan normalt lide apt-get mere end rpm, men nu får debian -1 for ikke at gemme installationsdatoen i databasen. Debian-tricket inkluderer alle de installerede pakker, ikke kun de valgte pakker, men det ‘ er en god start.
  • For Debian få mindre cruft (fjerner half-installed poster) hvis du gør: grep install\ /var/log/dpkg.log
  • @Mikel – Fantastisk svar. Jeg udvidede til ‘ saml /var/lib/dpkg/info/*.list filinfo ‘ og tilføjede kode for at filtrere alle ud men ” pakker på øverste niveau ” (atp-pakker, som ingen andre atp-pakker er afhængige af). Det < askubuntu.com/a/948532/723997> indlæg besvarer spørgsmålet ” Hvordan kan jeg se historikken om apt-get installationskommandoer, som jeg manuelt har udført? “.
  • Debian / Ubuntu: grep " install " /var/log/dpkg.log viser kun “installation” -linjerne i stedet for at vise “status” også.
  • Hvis hverken apt eller dpkg gemmer installation / ændret datatid, virker det ret uacceptabelt for mig i 2019. Vi er afhængige af at gribe logfiler, som måske eller ikke stadig er på maskinen? Hvordan er dette tilfældet?

Svar

Mikel har vist, hvordan man gør dette på dpkg-niveau . Især oprettes /var/lib/dpkg/info/$packagename.list, når pakken er installeret (og ikke ændres bagefter).

Hvis du brugte APT-værktøjerne (hvilket du formodentlig gjorde siden du “) er bekymret over automatisk mod manuelt installerede pakker), er der “en historie i /var/log/apt/history.log. Så længe den ikke har roteret væk, holder den styr på alle APT-installationer, opgraderinger og fjernelser med en kommentar til pakker markeret som automatisk installeret. Dette er en ret ny funktion, der blev introduceret i APT 0.7.26, så i Debian dukkede op. I Ubuntu, 10.04 har history.log, men den automatisk installerede kommentar er først til 10.10.

Kommentarer

  • Som Mikel påpegede: ” Og til sidst gamle /var/log/dpkg.log.* filer slettes ved logrotation, så den måde er ikke ‘ t garanterer at give dig hele historikken for dit system. “. Se dette < askubuntu.com/a/948532/723997 > svar for, hvordan man finder de nuværende topniveaupakker (hvilket betyder dem, som ingen anden pakke afhænger af)

Svar

Groft, men fungerer:

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 

Kommentarer

  • Boo, hvæs til analyse af output fra ls. Se mywiki.wooledge.org/ParsingLs for noter om, hvorfor dette er farligt / iboende buggy – den sikrere mulighed er at bruge enten find -printf eller stat --format for at generere en stream, der entydigt kan parses.
  • @CharlesDuffy Dejligt link, men med det formål at gøre det enkelt ved hjælp af ls -al --time-style=long-iso skal være nyttigt. Derudover er det sandsynligvis uhørt, at nogen vil navngive en APT-pakke med \n\t\r\v i navnet.

Svar

Her er one-liner alle ønsker og har brug for:

 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  

Resultatet viser alle (nyligt) installerede og opgraderede pakker i kronologisk rækkefølge.

Linjeforklaringen:

  • ls -1t – hent alle dpkg.log* filnavne i kronologisk rækkefølge
  • zcat -f HVIS filen er af gzip type, skal du derefter dekomprimere den, ELSE videregiver bare indholdet.
  • tac – Omvendt output fra kat , linje for linje for at sikre, at vi får den korrekte kronologiske rækkefølge.
  • grep – Kontroller kun for installeret eller opgradere pakker.
  • awk -F ":a" – Adskil feltet arkitektur fra pakkens navn
  • column -t – smukt udskriv kolonnerne adskilt af mellemrum

Man vil selvfølgelig gerne lave et alias for dette, men det er desværre ikke muligt som awk afhænger af både single og dobbelt citater. I den henseende placeres dette bedst i et bash-script, og hvor : separatoren håndteres bedre for andre arkitekturer i feltkolonnen.

Outputtet er:

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 

Ulempe:

  • Som vist ovenfor fungerer det kun på ARM-arkitektur og har brug for en lille ændring af arkitekturfeltadskilleren
  • Skal sættes i et script til let alias
  • Er ikke blevet testet på tværs af andre * nix-systemer

Svar

Filen /var/log/apt/history.log har et akavet format IMHO.

Startdato: {date} {time } Kommandolinje: {kommando} {valgmuligheder …} Installer: {pakke (version)}, …, {pakke (version)}, … Slutdato: {dato} {tid}

Jeg ville have foretrukket en mere logfil-formateret post

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

eller noget XML, der ikke kun viser en { pakke} men alle {afhængigheder}.

Som aktuelt implementeret, c en opdage de oplysninger, du søger, men det kræver en del retsmedicinsk behandling for at udtrække detaljerne.

Svar

Dette fungerer for mig på en Debian-system, jeg gætter på, at filformatet har ændret sig siden 2011. Dette system er ret nyt, så jeg ville ikke forvente, at dette fungerer på et ældre system, selvom det måske bare kræver, at logfilerne udpakkes og en glob bruges til at henvise til alle af dem.

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

De to første felter i hver linje i filen /var/log/dpkg.log er datoen og klokkeslættet. Bemærk efterpladsen med installation i grep-delen, dette skyldes, at opgraderinger kan udløse installationer, men hvis jeg forstod rigtigt, ville du vide, hvad der blev installeret af brugerne.

Kommentarer

  • Præcis hvad jeg laver. Let. Men du kan bruge zgrep, og dine alle .gz-logfiler søges som zgrep ‘ install ‘ /var/log/dpkg.log *.Placer mellemrummet foran ordet ” installer ” for at forhindre de irriterende ” halvinstallationer “. Jeg var nødt til at bruge cut -f1,5 for at få feltet med pakkenavn. Naturligvis roterer de gamle logfiler til sidst ud.

Svar

GNU / Linux Debian har ingen indbyggede værktøjer til dette problem, men al information om programmer installeret i standard måde gemmes i filer med programnavn. liste på placeringen / var / lib / dpkg / info / . Men der er ingen oplysninger om manuelt installerede programmer der.


En lang enkeltlinjeløsning :

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 

Forklaring :

  1. ls -rt output filer sorteret efter datoændring i omvendt rækkefølge ie med de nyeste filer i slutningen af listen.
  2. stat udskriver filen “s dato i menneskelig læsbar form.
  3. printf viser pakkens navn og datoen for den sidste ændring.
  4. for loop som helhed udskriver pakkenavne og datoer fra ældste til nyeste.

Eksempel på output (trunkeret):

......................................... 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 

Hovedfejlen ved denne løsning er, at den ikke er godt testet i produkt ion.

Kommentarer

  • Dette er en smuk løsning, der gør jobbet næsten færdig. Det ‘ er kun ulemper, er at (1) det ‘ er meget langsomt og (2) at det kun viser, når en pakke blev sidst opdateret , ikke nogen af den ‘ s tidligere versioner. Dette er naturligvis ikke et problem med one-liner, men hvordan dpkg ikke ‘ ikke holder styr på historien i /var/lib/dpkg/info/. Det er også derfor, at brug af /var/log/dpkg.log* måske foretrækkes.

Svar

Bemærk dette, fordi du nævner, at andre distributionssvar er velkomne. rpm har et stort sæt tags til outputformat, hvoraf den ene er INSTALLTIME. (Brug wget som et eksempel)

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

Dette kan formateres på få måder. Jeg bruger det på denne måde:

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

Disse to sider har masser af god information om løsning af problemer med RPM-metadata:

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

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

Sortering af disse oplysninger vil give dig en fungerende løsning til dit problem.

Svar

Det er groft, men fungerer lige så hurtigt som andre løsninger. Datoformat er yyyymmddhhmmss, hvilket betyder, at en bit eller ombestilling og formatfjerning resulterer i et nummer, der kan sorteres.

Mange tak til de andre løsninger, denne liste pakkenavne i den rækkefølge af installation, der kunne bruges i et bygget operativsystem til kopi.

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

Kommentarer

  • Velkommen @ alexander-cave! Tilføj venligst et par linjer med output , så folk kan se, hvilken type output de kan forvente.

Svar

Med roterede logfiler i apt kan du:

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

Svar

Jeg har opnået det på Kubuntu med følgende kommandoer:

  1. Liste over pakkerne.
  2. læs hver standardindgang.
  3. gem den fulde sti (sti | oprettet dato) med formatet “% n |% y ” til en variabel.
  4. gemme navnet på filen i en variabel
  5. hvis begge tidligere kommandoer blev udført med succes, vil værdier blive udskrevet i en enkelt linje.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done 

Med venlig hilsen

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *