Seznam balíků v systému založeném na apt podle data instalace

Jak mohu zobrazit seznam nainstalovaných balíků podle data instalace?

Musím to udělat na debian / ubuntu. Pěkné by byly i odpovědi na jiné distribuce.

Nainstaloval jsem spoustu věcí, abych zkompiloval určitý kus kódu, a chci získat seznam balíčků, které jsem musel nainstalovat.

Komentáře

Odpověď

Distribuce založené na RPM, jako je Red Hat, jsou snadné:

rpm -qa --last 

V Debianu a dalších distribucích založených na dpkg je také váš konkrétní problém snadný:

grep install /var/log/dpkg.log 

Pokud nebyl soubor protokolu otočen, měli byste to zkusit:

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

Obecně se zdá, že dpkg a apt nesledují datum instalace, což je způsobeno nedostatkem takového pole v dpkg-query manuálová stránka.

A nakonec budou staré /var/log/dpkg.log.* soubory smazány rotací protokolu, takže to tak není “ zaručeně vám neposkytne celou historii vašeho systému.

Jeden návrh, který se objeví několikrát (např toto vlákno ) je podívat se do adresáře /var/lib/dpkg/info. Soubory tam naznačují, že byste mohli zkusit něco jako:

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

Chcete-li odpovědět na svou otázku ohledně výběru, zde je první průchod.

sestavit seznam balíčků podle 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 

sestavit seznam nainstalovaných balíčků

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

připojit se ke dvěma seznamům

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

Z nějakého důvodu to “ netiskne pro mě příliš mnoho rozdílů, takže může existovat chyba nebo neplatný předpoklad o tom, co --get-selections znamená.

Balíky můžete samozřejmě omezit buď pomocí find . -mtime -<days> nebo head -n <lines> a změňte výstupní formát, jak chcete, např.

$ 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 

zobrazí seznam pouze výběrů, které byly nainstalovány (změněny?) za poslední 4 dny.

Pravděpodobně můžete také odebrat příkazy sort po ověření pořadí řazení používaného dpkg --get-selections a vytvořením find efektivnější.

Komentáře

  • Obvykle se mi apt-get líbí více než rpm, ale nyní debian dostane -1 za to, že neuložil datum instalace do databáze. Trik debian zahrnuje všechny nainstalované balíčky, nejen vybrané balíčky, ale je to ‚ dobrý začátek.
  • Pro Debian máte získejte méně času (odstraní half-installed položky), pokud to uděláte: grep install\ /var/log/dpkg.log
  • @Mikel – skvělá odpověď. Rozbalil jsem ‚ shromáždit informace o souboru /var/lib/dpkg/info/*.list ‚ a přidal kód k odfiltrování všech ale “ balíčky nejvyšší úrovně “ (balíčky atp, na kterých nejsou závislé žádné další balíčky atp). Tento < askubuntu.com/a/948532/723997> příspěvek odpovídá na otázku “ Jak mohu zobrazit historii instalačních příkazů apt-get, které jsem provedl ručně? „.
  • Debian / Ubuntu: grep " install " /var/log/dpkg.log vypisuje pouze řádky „instalace“, místo aby zobrazoval i ty „stavové“.
  • Pokud ani apt, ani dpkg neukládají instalovaný / upravený datetime, zdá se mi to v roce 2019 docela nepřijatelné. Spoléhali jsme se na grepování logovacích souborů, které na stroji mohou nebo nemusí být? Jak je to v tomto případě?

Odpověď

Mikel ukázal, jak to udělat na úrovni dpkg . Zejména /var/lib/dpkg/info/$packagename.list se vytvoří, když je balíček nainstalován (a následně upraven).

Pokud jste použili nástroje APT (což jste pravděpodobně udělali, protože jste „) obáváte se automaticky vs ručně instalovaných balíků), v /var/log/apt/history.log je historie. Dokud se neotočí, sleduje všechny instalace, upgrady a odebrání APT s anotací pro balíčky označené jako automaticky nainstalované. Toto je poměrně nová funkce, zavedená v APT 0.7.26, takže v Debianu se objevil v squeeze. V Ubuntu 10.04 má history.log, ale automaticky nainstalovaná anotace je k dispozici až 10.10.

Komentáře

  • Jako Mikel poukázal na: “ A nakonec budou staré soubory /var/log/dpkg.log.* smazány rotací protokolů, takže tak nebude ‚ zaručeně vám poskytne celou historii vašeho systému. „. Viz toto < askubuntu.com/a/948532/723997 > odpověď na to, jak detekovat aktuální balíčky nejvyšší úrovně (tj. ty, na kterých žádný jiný balíček závisí)

odpověď

Drsný, ale funguje:

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 

Komentáře

  • Boo, syčení při analýze výstupu z ls. Viz mywiki.wooledge.org/ParsingLs , kde najdete poznámky, proč je to nebezpečné / neodmyslitelně chybné – bezpečnější možností je použít buď find -printf nebo stat --format k vygenerování streamu, který lze jednoznačně analyzovat.
  • @CharlesDuffy Pěkný odkaz, ale pro zjednodušení použití ls -al --time-style=long-iso by mělo být užitečné. Kromě toho je pravděpodobně neslýchané, že by někdo pojmenoval balíček APT se jménem \n\t\r\v.

Odpovědět

Tady je jedna linka, kterou každý chce a potřebuje:

 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  

Výsledek zobrazí všechny (nově) nainstalované a upgradované balíčky v chronologickém pořadí.

Vysvětlení řádku:

  • ls -1t – získejte všechny dpkg.log* názvy souborů v chronologickém pořadí
  • zcat -f KDYŽ je soubor gzip , pak jej dekomprimujte, JINÉ stačí předat obsah.
  • tac – Zpětný výstup kočky , řádek po řádku, abychom zajistili správné chronologické pořadí.
  • grep – Zkontrolujte pouze nainstalované nebo upgradovat balíčky.
  • awk -F ":a" – oddělit pole architektura od názvu balíčku
  • column -t – pěkně vytisknout sloupce oddělené mezerou

Dalo by se samozřejmě udělat alias, ale bohužel to není možné, protože awk závisí na jednoduchém i uvozovky. V tomto ohledu je to nejlepší dát do bash skriptu a kde je : oddělovač lépe zpracován pro ostatní architektury ve sloupci pole.

Výstup je:

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 

Nevýhoda:

  • Jak je uvedeno výše, funguje pouze na architektuře ARM a vyžaduje malou úpravu pro oddělovač polí architektury.
  • Je třeba vložit skript pro snadný alias
  • Nebyl testován na jiných systémech * nix

Odpověď

Soubor /var/log/apt/history.log má nepříjemný formát IMHO.

Počáteční datum: {date} {čas } Příkazový řádek: {command} {options …} Install: {package (version)}, …, {package (version)}, … End-Date: {date} {time}

Chtěl bych upřednostnit záznam ve více formátu souboru protokolu

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

nebo nějaký XML zobrazující nejen { package} but any {dependencies}.

Jak je aktuálně implementováno, můžete c objevte informace, které hledáte, ale k získání podrobností je nutné určité forenzní zpracování.

Odpověď

Toto funguje pro mě na Systém Debian, hádám, že se formát souboru změnil od roku 2011. Tento systém je docela nový, takže bych neočekával, že by to fungovalo na starším systému, i když to může vyžadovat pouze rozbalení protokolů a použití globu k označení všech z nich.

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

První dvě pole v každém řádku souboru /var/log/dpkg.log jsou datum a čas. Všimněte si koncového prostoru s instalací v grep části, je to proto, že upgrady mohou spouštět instalace, ale pokud jsem správně pochopil, chtěli byste vědět, co si uživatelé nainstalovali.

Komentáře

  • Přesně to, co dělám. Snadný. Můžete ale použít zgrep a všechny vaše protokoly .gz budou prohledány jako zgrep ‚ install ‚ /var/log/dpkg.log *.Umístěte mezeru před slovo “ install „, abyste zabránili těmto otravným “ polovičním instalacím „. Musel jsem použít cut -f1,5, abych získal pole názvu balíčku. Samozřejmě se nakonec staré protokoly otočí.

Odpověď

GNU / Linux Debian nemá žádné vestavěné nástroje pro tento problém, ale všechny informace o programech nainstalovaných standardním způsobem se ukládají do souborů s název-programu. seznam v umístění / var / lib / dpkg / info / . Neexistují však žádné informace o ručně nainstalovaných programech.


Dlouhé jednořádkové řešení :

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 

Vysvětlení :

  1. ls -rt vypíše soubory seřazené podle změna data v opačném pořadí, tj. s nejnovějšími soubory na konci seznamu.
  2. stat vytiskne soubor datum v podobě čitelné pro člověka.
  3. printf zobrazí název balíčku a datum jeho poslední úpravy.
  4. for smyčka jako celek vytiskne názvy balíčků a data od nejstarších po nejnovější.

Příklad výstupu (zkrácen):

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

Hlavní vadou tohoto řešení je, že to není dobře otestováno v produktu ion.

Komentáře

  • Toto je krásné řešení, díky kterému je práce téměř hotová. Má ‚ pouze nevýhody, je to (1) je ‚ velmi pomalý a (2) zobrazuje se pouze tehdy, když balíček byl naposledy aktualizován , žádná z jeho ‚ předchozích verzí. To samozřejmě není problém jednorázové linky, ale jak dpkg ‚ ne sleduje historii v /var/lib/dpkg/info/. I proto může být upřednostňováno použití /var/log/dpkg.log*.

Odpověď

Beru na vědomí, protože zmiňujete, že další odpovědi na distribuci jsou vítány. rpm má velkou sadu značek výstupního formátu, z nichž jeden je INSTALLTIME. (Jako příklad používáme wget)

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

Lze jej naformátovat několika způsoby. Používám to takto:

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

Tyto dvě stránky obsahují spoustu skvělých informací o řešení problémů s metadaty RPM:

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

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

Třídění těchto informací vám poskytne funkční řešení vašeho problému.

Odpovědět

Je to hrubé, ale funguje to stejně rychle jako jiná řešení. Formát data je rrrrmmddhhmmss, což znamená, že výsledkem bitů nebo přeskupení a formátování je číslo, které lze třídit.

Mnohokrát děkuji za další řešení, tento seznam jmen balíků v pořadí instalace, které lze použít v vytvořený operační systém pro kopírování.

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

Komentáře

  • Vítejte @ alexander-cave! Přidejte několik řádků výstupu , aby lidé viděli, jaký druh výstupu lze očekávat.

Odpovědět

S rotovanými logfiles v apt můžete:

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

odpovědět

Dosáhl jsem toho na Kubuntu pomocí následujících příkazů:

  1. Seznam balíčků.
  2. přečtěte si každý standardní vstup.
  3. uložte celý cesta (cesta | datum vytvoření) ve formátu „% n |% y “ do proměnné.
  4. uložit název souboru do proměnné
  5. pokud byly oba předchozí příkazy provedeny úspěšně, hodnoty se vytisknou do jednoho řádku.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done 

S pozdravem,

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *