Csomagok felsorolása apt alapú rendszeren telepítési dátum szerint

Hogyan sorolhatom fel a telepített csomagokat telepítési dátum szerint?

Ezt meg kell tennem a debian / ubuntuban. A többi terjesztésre adott válasz is jó lenne.

Sok dolgot telepítettem egy bizonyos kód összeállításához, és szeretnék egy listát a telepítendő csomagokról.

Megjegyzések

Válasz

Az RPM-alapú terjesztések, például a Red Hat, egyszerűen:

rpm -qa --last 

A Debian és más dpkg-alapú terjesztések esetén az Ön problémája is egyszerű:

grep install /var/log/dpkg.log 

Hacsak a naplófájlt nem forgatták, akkor próbálkozzon:

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

Általában úgy tűnik, hogy a dpkg és a apt nem követi a telepítés dátumát, mivel ilyen mező hiányzik a dpkg-query man oldal.

És végül a régi /var/log/dpkg.log.* fájlokat naplóforgatással töröljük, így nem lesz ” garantáltan megadja a rendszer teljes történetét.

Egy javaslat, amely néhányszor megjelenik (pl ez a szál ) a /var/lib/dpkg/info könyvtárat keresi. Az ott található fájlok azt javasolják, hogy próbálkozzon valami hasonlóval:

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

A válaszokkal kapcsolatos kérdésének megválaszolásához itt az első lépés.

a csomagok listájának dátum szerinti összeállítása

$ 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 

a telepített csomagok összeállítási listája

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

csatlakozzon a 2 listához

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

Valamiért ” s nem nagyon sok különbséget nyomtat ki számomra, ezért előfordulhat, hogy hibát vagy érvénytelen feltételezést jelentenek az --get-selections jelentése.

Nyilvánvalóan korlátozhatja a csomagokat akár: find . -mtime -<days> vagy head -n <lines> használatával, és tetszés szerint változtassa meg a kimeneti formátumot, pl.

$ 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 

csak az elmúlt 4 napban telepített (módosított?) választások felsorolásához.

Valószínűleg eltávolíthatja a sort parancsokat is miután ellenőrizte a dpkg --get-selections által használt rendezési sorrendet, és elkészítette a find parancs hatékonyabb.

Megjegyzések

  • Általában jobban szeretem a apt-get -t, mint a rpm, de most a debian -1-et kap, mert nem mentette el a telepítés dátumát az adatbázisban. A debian trükk az összes telepített csomagot magában foglalja, nem csak a kiválasztott csomagokat, de ‘ is jó kezdet.
  • A Debian számára kap kevesebb Cruft (eltávolítja a half-installed bejegyzéseket), ha u: grep install\ /var/log/dpkg.log
  • @Mikel – Remek válasz. Kibővítettem a ‘ collect /var/lib/dpkg/info/*.list fájlinformációkat ‘, és kódot adtam az összes kiszűrésére de a ” legfelső szintű csomagok ” (atp csomagok, amelyektől nem függ más atp csomag). Ez a < askubuntu.com/a/948532/723997> bejegyzés megválaszolja a kérdést ” Hogyan tekinthetem meg az manuálisan végrehajtott apt-get install parancsok előzményeit? “.
  • Debian / Ubuntu: grep " install " /var/log/dpkg.log csak az „install” sorokat sorolja fel, ahelyett, hogy az „status” sorokat is megjelenítené.
  • Ha sem az apt, sem a dpkg store telepítési / módosítási dátum ideje nem tűnik elfogadhatónak számomra 2019-ben. Bízunk a grepping naplófájlokban, amelyek esetleg még vannak a gépen? Hogy van ez?

Válasz

Mikel megmutatta, hogyan kell ezt csinálni dpkg szinten . Különösen a /var/lib/dpkg/info/$packagename.list jön létre a csomag telepítésekor (és nem módosítják utólag).

Ha az APT eszközöket használta (amit feltehetően azóta is tett ” aggódnak az automatikusan vs manuálisan telepített csomagok miatt), a “div history = /var/log/apt/history.log. Amíg nem forog el, nyomon követi az összes APT telepítést, frissítést és eltávolítást, az automatikusan telepítettként megjelölt csomagokhoz tartozó kommentárokkal. Ez egy meglehetősen friss szolgáltatás, amelyet az APT 0.7.26, tehát a Debian tartalmaz. Az Ubuntuban 10.A 04-nek history.log van, de az automatikusan telepített kommentár csak 10.10-ig van jelen.

Megjegyzések

  • Mint Mikel rámutatott: ” És a régi /var/log/dpkg.log.* fájlokat végül naplóforgatással töröljük, így nem lesz ‘ t garantálja a rendszer teljes előzményeinek átadását. “. Lásd ezt: < askubuntu.com/a/948532/723997 > válasz az aktuális legfelső szintű csomagok észlelésére (vagyis azokra, amelyektől nem függ más csomag)

Válasz

Durva, de működik:

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 

megjegyzések

  • Bú, hisztiz a kimenet elemzéséhez ls. A mywiki.wooledge.org/ParsingLs oldalon talál megjegyzéseket arról, hogy ez miért veszélyes / eredendően hibás – a biztonságosabb lehetőség a vagy stat --format egy olyan adatfolyam előállításához, amely egyértelműen elemezhető.
  • @CharlesDuffy Nice link, de az egyszerűség kedvéért a ls -al --time-style=long-iso hasznos lehet. Ezenkívül valószínűleg nem hallható, hogy valaki egy APT csomagot a \n\t\r\v névvel nevezne meg.

Válasz

Itt van az egyvonalas vonal, amelyet mindenki szeretne és amire szüksége van:

 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  

Az eredmény az összes (újonnan) telepített és frissített csomag időrendi sorrendben jelenik meg.

A sor magyarázata:

  • ls -1t – az összes dpkg.log* fájlnév megszerzése időrendben
  • zcat -f HA fájl gzip típusú, akkor bontsa ki, Az ELSE csak továbbadja a tartalmat.
  • tac – A cat fordított kimenete , soronként, hogy megbizonyosodjon arról, hogy a helyes időrendet kapjuk-e.
  • grep – Csak telepítve vagy upgrade csomagok.
  • awk -F ":a" – Válassza el az architektúra mezőt a csomag nevétől
  • column -t – szépen nyomtassa ki az oszlopokat szóközzel elválasztva

Ehhez természetesen álnevet szeretne készíteni, de sajnos ez nem lehetséges Az awk mind az egyedülálló, mind a kettős idézetek. Ebben a tekintetben ezt a legjobban egy bash szkriptbe lehet beilleszteni, és ahol a : elválasztót jobban kezeljük a mező oszlop többi architektúrájához .

A kimenet:

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 

Hátrány:

  • Amint fentebb bemutattuk, csak ARM architektúrán működik, és az architektúra mezőelválasztóhoz szükséges némi módosítás.
  • Be kell helyezni az egyszerű álnevek parancsfájlja
  • Nem tesztelték más * nix rendszereken

Válasz

A /var/log/apt/history.log fájl kényelmetlen formátumú IMHO.

Kezdő dátum: {date} {idő } Parancssor: {parancs} {opciók …} Telepítés: {csomag (verzió)}, …, {csomag (verzió)}, … Befejezés dátuma: {dátum} {idő}

Jobban szerettem volna egy naplófájl-formázottabb rekordot

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

vagy valamilyen XML, amely nemcsak egy { csomag}, de bármely {függőség}.

A jelenlegi megvalósításnak megfelelően c egy felfedezni a keresett információt, de a részletek kibontásához némi törvényszéki feldolgozást igényel.

Válasz

Ez nálam működik Debian rendszer, azt hiszem, hogy a fájlformátum 2011 óta megváltozott. Ez a rendszer meglehetősen friss, ezért nem várnám, hogy ez egy régebbi rendszeren működjön, bár ehhez csak a naplók kibontása és egy glob használata szükséges az összes hivatkozásához. közülük.

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

A /var/log/dpkg.log fájl minden egyes sorának első két mezője a dátum és az idő. Vegye figyelembe, hogy a grep részben található a hely a telepítéssel, ez azért van, mert a frissítések kiválthatják a telepítéseket, de ha jól értettem, akkor tudni akarta, hogy mit telepítettek a felhasználók. megjegyzések “>

  • Pontosan mit csinálok. Könnyen. De használhatod a zgrep-t, és az összes .gz-naplóod a zgrep ‘ install módon fog keresni ‘ /var/log/dpkg.log *.Helyezze a szóközt a ” install elé a ” szó elé, hogy megakadályozza ezeket a bosszantó ” félig telepítéseket “. A -f1,5 vágót kellett használnom a csomagnév mező megszerzéséhez. Természetesen végül a régi naplók elfordulnak.
  • Válasz

    A GNU / Linux Debian nem tartalmaz beépített eszközöket erre a problémára, de a szokásos módon telepített programok minden információját a programnév fájlokba menti. list a / var / lib / dpkg / info / helyen. De a manuálisan telepített programokról nincsenek információk.


    Hosszú egysoros megoldás :

    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 

    Magyarázat :

    1. ls -rt fájlokat ad ki rendezés szerint a dátum módosítása fordított sorrendben, ie a legújabb fájlokkal a lista végén.
    2. stat kinyomtatja a fájlt dátum ember által olvasható formában.
    3. printf megjeleníti a csomag nevét és utolsó módosításának dátumát.
    4. A for ciklus egészében kinyomtatja a csomagneveket és dátumokat a legrégebbről a legújabbra.

    Kimeneti példa (csonka):

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

    A megoldás fő hibája. hogy nem jól tesztelt termék ion.

    Megjegyzések

    • Ez egy gyönyörű megoldás, amely szinte elvégzi a munkát. ‘ csak hátrányai, hogy (1) nagyon lassan ‘ és (2) csak akkor jelenik meg, ha egy csomagot utoljára frissítettek , egyikük sem korábbi verzióit. Ez természetesen nem az egyvonalas probléma, hanem az, hogy a dpkg nem ‘ hogyan követi nyomon a /var/lib/dpkg/info/ történelmet. Ezért is előnyösebb a /var/log/dpkg.log* használata.

    Válasz

    Megjegyezve ezt, mert megemlíti, hogy más terjesztési válaszokat is szívesen fogadunk. Az rpm nagy kimeneti formátumú címkékkel rendelkezik, amelyek közül az egyik INSTALLTIME. (Például a wget példát használja)

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

    Ez többféleképpen is formázható. Így használom:

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

    Ez a két oldal rengeteg nagyszerű információval rendelkezik az RPM metaadatokkal kapcsolatos problémák megoldásáról:

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

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

    Az információk rendezése megfelelő megoldást kínál a problémájára.

    Válasz

    Durva, de ugyanolyan gyorsan működik, mint más megoldások. A dátum formátuma ééééhhhhmmmss, ami azt jelenti, hogy egy kicsit, vagy az átrendezés és a formátumeltávolítás eredményeként rendezhető számot eredményez.

    A többi megoldásnak köszönhetően ez a csomag a telepítés sorrendjében nevezi el a egy másolásra kész operációs rendszer.

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

    Megjegyzések

    • Üdvözöljük @ alexander-barlang! Kérjük, adjon hozzá néhány sort output -ból, hogy az emberek láthassák, milyen kimenetre számítanak.

    Válasz

    Az apt forgatott naplófájljaival a következőket teheti:

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

    válasz

    A következő parancsokkal értem el a Kubuntun:

    1. Sorolja fel a csomagokat.
    2. olvassa el az összes szabványos bemenetet.
    3. tárolja a teljes elérési út (elérési út | létrehozott dátum) “% n |% y ” formátumban változóvá.
    4. tárolja a fájl nevét egy változóba
    5. ha mindkét korábbi parancs sikeresen végrehajtásra került, az értékeket egyetlen sorban nyomtatják ki.
    ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done 

    Üdvözlettel:

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük