Finden Sie heraus, welche Pakete nach der OS-Installation installiert wurden

7

Wie finde ich heraus, welche Pakete seit der Installation des Betriebssystems installiert wurden ? Ich möchte nicht alle installierten Pakete kennen, nur diejenigen, die nicht Teil der anfänglichen Betriebssysteminstallation waren und anschließend explizit installiert wurden.

Nehmen wir für diese Frage eine Neuinstallation an, da ich mir vorstelle, dass Distribution-Upgrades die Sache komplizieren würden. Ich würde lieber die Befehlszeile verwenden, aber eine GUI-Lösung wäre in Ordnung, wenn ein Befehl oder ein Skript nicht verfügbar ist.

Ich habe mir die Manpages von dpkgund kurz angesehen aptitude, aber nichts Offensichtliches gesehen. Außerdem gibt die Ausgabe von apt-cache show package-nameoder dpkg -s pkg-namescheint keine Daten anzugeben, die mit dem Datum der Betriebssysteminstallation verglichen werden können (was ich auch herausfinden müsste, wie man es bekommt).

Ich habe logwatchauf einem Server, der täglich Benachrichtigungen darüber sendet, was installiert wurde. Ich vermute, dass es dpkg.log analysiert. Ich bin mir nicht sicher, ob diese Methode eine Lösung wäre, da viele der Installationseinträge möglicherweise protokolliert wurden, insbesondere auf älteren Systemen. Und idealerweise sollte dies für jedes System, jeden Desktop oder jeden Server funktionieren.

Es wäre auch großartig, wenn die Ausgabe die Version des aktuell installierten Pakets enthalten könnte, aber das könnte zu viel verlangen, und ich kann es später immer noch skripten, sobald ich die Paketnamen habe.

drgrog
quelle
1
Ich möchte nicht alle installierten Pakete auflisten, sondern nur diejenigen, die nach der Installation des Betriebssystems installiert wurden. Beispielsweise gibt der dpkg --get-selections | grep -v deinstallBefehl Pakete wie xorg und wget aus, die Teil der Erstinstallation gewesen wären. Ich werde die Frage bearbeiten.
Drgrog
1
Eine diffZwischenausgabe dpgk --get-selectionsund diese Datei werden etwas tun, wonach Sie suchen
Ayush
Vielen Dank. Ich habe unter unix.stackexchange.com/questions/3595/… ein genaueres Duplikat gefunden - und die Antwort unix.stackexchange.com/a/80520/9132 ist die bisher am nächsten liegende. Die Manifest-Methode schien mir alles in einem zu geben Maschine (als ob Kommunikation nicht funktionieren würde), plus Eignung wurde nicht auf einer anderen Maschine installiert.
Drgrog
@karel die Antwort von bci unter Verwendung der history.log, gibt Ihnen keine vollständige Liste, wenn die Protokolle nicht so weit zurückgehen wie die ursprüngliche Installation
drgrog
@drgrog Ich kann Ihren Standpunkt verstehen. Was Sie getan haben, ist eine Verbesserung der Antworten, die bereits von anderen gepostet wurden, und kein Duplikat. Ihre Frage ist eine würdige Frage und kein Duplikat.
Karel

Antworten:

7

Alle Ubuntu ISO ([UKLX] Buntu / Ubuntu-Gnome) werden mit einer .manifestDatei geliefert , die die Liste aller vorinstallierten Pakete in der ISO enthält. Sie finden diese Manifestdateien im selben Download-Verzeichnis wie diese ISO-Dateien auf allen Ubuntu-ISO-Spiegeln. Nehmen Sie als Beispiel die Liste der verfügbaren Ubuntu-Versionen . Wenn Sie beispielsweise über Trusty64-Bit verfügen, lautet der Manifest-Link http://releases.ubuntu.com/trusty/ubuntu-14.04.2-desktop-amd64.manifest .

Wenn Sie diese Datei haben, vergleichen Sie einfach die darin enthaltene Paketliste mit der Liste aller in Ihrem Ubuntu installierten Pakete mit dem commBefehl

$ curl -O http://releases.ubuntu.com/trusty/ubuntu-14.04-desktop-amd64.manifest
$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
        <( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort )

Um zu erklären, was das commmacht, werden Eingaben aus 2 Dateien vorgenommen - die erste liefert die Liste aller derzeit installierten Pakete und die zweite die Manifestdatei. Das -3opt unterdrückt Zeilen, die beide Dateien haben, und -2unterdrückt Zeilen, die nur die zweite Datei (dh die Manifestdatei) hat. Am Ende enthält Ihre Ausgabe also nur Zeilen, die nur eine Datei enthält, und die Ihnen Pakete enthält, die Sie seit der Installation des Betriebssystems manuell installiert haben.

Da haben Sie es also.

Bearbeiten

Wenn Sie auch die Paketversion neben dem Paketnamen in der Ausgabe sehen möchten, wie Slyvain Pineau betont hat, leiten Sie den commobigen Befehl an, xargs dpkg-query -W -f='${binary:Package} ${Version}\n'damit er wird

$ comm -23 <( dpkg --get-selections | awk '$2 ~ /^(install|hold)/ { print $1 }' | sort ) \
           <( awk '{ print $1 }' ubuntu-14.04-desktop-amd64.manifest | sort ) | \
           xargs dpkg-query -W -f='${binary:Package} ${Version}\n

Oder alternativ mit awkvollständig. Auch dies ergibt das gleiche Ergebnis wie der obige Befehl

awk 'FNR==NR {arr[$1];next} !($1 in arr) { print $0 }' ubuntu-14.04-desktop-amd64.manifest <( dpkg-query -W -f='${binary:Package} ${Version}\n' )

Unter diesem Link finden Sie Erklärungen zur Funktionsweise von awk cmd

Feuerstein
quelle
@ Sylvain Pineau - dpkg-Abfrage nimmt keine Eingabe von stdin
Flint
Es tut uns leid. Nächstes Mal werde ich es noch einmal überprüfen. Es sollte sein [...] | xargs dpkg-query -W -f='${binary:Package} ${Version}\n'. Fühlen Sie sich frei, Ihre Antwort mit dem Versionszusatz zu bearbeiten :)
Sylvain Pineau
3

Die Abfragemethoden initial-status.gz und dpkg von https://unix.stackexchange.com/a/80520/9132 bieten die genaueste und präziseste Liste für meine Anforderungen.

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

Warum ich es mag und nicht die anderen:

Die Manifest-Vergleichsmethode aus Flints Antwort und aus https://unix.stackexchange.com/a/3624/9132 enthält viele Abhängigkeiten und andere Pakete, die möglicherweise als "erforderlich" gekennzeichnet und automatisch installiert werden. Beispielsweise werden libvlc5- und vlc-Daten aufgelistet , während bei der obigen Methode nur vlc aufgelistet wird .

Die history.log- Methode von https://askubuntu.com/a/250530/16741 listet nicht alle Pakete auf, wenn die Protokolle nicht bis zur Installation der Version zurückreichen. Es enthält auch viele Upgrade- Befehle, die herausgefiltert werden müssten.

Die Methode dpkg --get-selections , eine akzeptierte Antwort auf eine ähnliche Frage, listet alle Pakete und Abhängigkeiten auf, einschließlich der mit der Version installierten. Es werden nicht nur die explizit installierten aufgelistet.

drgrog
quelle
0

Vielen Dank und herzlichen Glückwunsch an diejenigen, die sich dieses Juwel eines Drehbuchs ausgedacht haben !!!
Ich wollte meine 2 ¢ hinzufügen und habe das Installationsdatum angeheftet, das ich aus $ info abgeleitet habe.
Ich habe die Details nicht gemeistert, warum $ info-Dateien aktualisiert werden oder nicht und wann, aber es funktioniert in der Praxis.
Mein Skript listet die neuesten Updates von Nicht-Abhängigkeitspaketen auf, die nach der Installation hinzugefügt wurden.
Als ich es regelmäßig überprüfte, sah ich, was ich ohne einen einzigen Fehler manuell protokolliert hätte.
Das heißt, Stapel von Paketen, die aus demselben Grund installiert wurden. Leider brechen Updates diese Reihenfolge.
Nach einem System-Upgrade hatte ich eine Liste meiner hinzugefügten Pakete, die das Upgrade nicht aktualisiert hat, gefolgt von denen, die es aktualisiert hat.
Ordentlich! Genießen.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
Papou
quelle