Nur lokal installierte Pakete anzeigen [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
nudgegoonies
Beiträge: 805
Registriert: 16.02.2009 09:35:10

Nur lokal installierte Pakete anzeigen [gelöst]

Beitrag von nudgegoonies » 17.04.2018 17:23:51

Synaptic hat da ja den schönen Menüpunkt "Installiert (lokal oder veraltet)". Ich brauche diese Funktionalität aber in einem script. Ich weiß, dass mich "dpkg nicht weiterbringt. Die Google-Lösungen benutzen aptitude, aber das ist auf den Zielsystemen auch nicht installiert. "apt-cache policy" hat auf jeden Fall die Informationen, die ich brauche:
openssh-server:
Installiert: 1:6.7p1-5+deb8u4
Installationskandidat: 1:6.7p1-5+deb8u4
Versionstabelle:
*** 1:6.7p1-5+deb8u4 0
500 http://ftp.de.debian.org/debian/ jessie/main amd64 Packages
100 /var/lib/dpkg/status
1:6.7p1-5+deb8u3 0
500 http://security.debian.org/ jessie/updates/main amd64 Packages
Schleife über alle reinen Paketnamen mit "dpkg -l" und jeden Paketnamen an "apt-cache policy" reichen ist einfach. Die Installierte Version erkenne ich an den 3 Sternchen. Aber dann schauen, ob da nur eine einzelne eingerückte Zeile und nicht mehrere eingerückte Zeilen da sind und bei der dann schauen ob die dann "/var/lib/dpkg/status" lautet klingt mir eher nach der Aufgabe für einen Parser. Das muss doch einfacher gehen. Jemand eine Idee?
Zuletzt geändert von nudgegoonies am 19.04.2018 10:06:48, insgesamt 1-mal geändert.
Soft: Stretch AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon 4670 MESA.
Hardware: Thinkstation S20, Intel X58, 8GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HD und DVD+RW.

Benutzeravatar
smutbert
Beiträge: 6409
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Nur lokal installierte Pakete anzeigen

Beitrag von smutbert » 17.04.2018 18:08:29

Wie wäre es mit Debianapt-show-versions?

Code: Alles auswählen

$ apt-show-versions | grep "No available version in archive$"
Das oder aptitude ist jedenfalls wesentlich schneller als die Liste mit apt-cache abzuklappern. Das Abklappern würde ich aber wenn mit »apt -a show Paketname« und der Zeile APT-Sources machen, ist allerdings weder schön noch schnell

Code: Alles auswählen

for i in $(dpkg -l | grep '^i' | awk '{ print $2 }'); do apt -a show $i 2> /dev/null | grep "^APT-Sources:" | grep -v "/var/lib/dpkg/status" > /dev/null || echo $i; done

nudgegoonies
Beiträge: 805
Registriert: 16.02.2009 09:35:10

Re: Nur lokal installierte Pakete anzeigen

Beitrag von nudgegoonies » 18.04.2018 10:50:56

Danke für den Tip. Es funktioniert sehr gut. Leider ist das auf den ganzen Servern auch nicht installiert. Ein Grep nach "newer than version in archive" brachte dann auch die internen Backports von Paketen, die es in Debian auch gibt zutage. Auch das ist mir sehr wichtig. Das "apt -a show" findet tatsächlich beide Arten von Paketen. Läuft auf meiner nicht gerade schwachen Workstation aber schon mehr als eine Viertelstunde :?

P.S.
Das grep -v stimmt glaube ich nicht. Bei mir funktionioert es so:

Code: Alles auswählen

for i in $(dpkg -l | grep '^i' | awk '{ print $2 }'); do apt -a show $i 2> /dev/null | grep "^APT-Sources:" | grep "/var/lib/dpkg/status" > /dev/null && echo $i; done
P.S.2.
apt ist auch nicht installiert. Sind viele Wheezy und Jessie Rechner wovon erstere demnächst abgeschafft werden. Es gibt also kein Tool, was zur minimalen Standardinstallation von Debian gehört, mit dem man es einfach rauskriegen kann :(
Soft: Stretch AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon 4670 MESA.
Hardware: Thinkstation S20, Intel X58, 8GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HD und DVD+RW.

Benutzeravatar
schorsch_76
Beiträge: 1783
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Nur lokal installierte Pakete anzeigen

Beitrag von schorsch_76 » 18.04.2018 13:08:40

Mit Versionscode

Code: Alles auswählen

dpkg --get-selections
Ohne Versionscode

Code: Alles auswählen

dpkg --get-selections | cut -f 1
Siehe
http://debiananwenderhandbuch.de/dpkg.html
dpkg --get-selections [<pattern> ...] get list of selections to stdout

Gibt, ohne weitere Parameter, eine Liste aller installierten Pakete aus. Wird zusätzlich ein „*“ angegeben, so werden alle Pakete mit dem aktuellen Zustand ausgegeben. Dies zeigt also auch zu löschende und nicht installierte Pakete an.

Diese Ausgabe kann in eine Datei geschrieben werden und mittels der Option --set-selections (beispielsweise auf einem anderen System oder aus einem Backup) wieder eingelesen werden. Somit können einzelne Systeme sehr leicht dupliziert werden. Auch kann auf diesem Wege ein System nach einem Hardware-Ausfall wiederhergestellt werden.

Beispiel:


dpkg --get-selections \* > /tmp/PAKETLISTE

Benutzeravatar
smutbert
Beiträge: 6409
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Nur lokal installierte Pakete anzeigen

Beitrag von smutbert » 18.04.2018 14:04:10

ich sehe nicht wie die Ausgabe von dpkg weiterhilft – jedenfalls erkenne ich dort nirgends ob ein Paket über apt verfügbar ist oder nicht
nudgegoonies hat geschrieben: ↑ zum Beitrag ↑
18.04.2018 10:50:56
[…]
P.S.2.
apt ist auch nicht installiert. Sind viele Wheezy und Jessie Rechner wovon erstere demnächst abgeschafft werden. Es gibt also kein Tool, was zur minimalen Standardinstallation von Debian gehört, mit dem man es einfach rauskriegen kann :(
Das ist fies, aber du kannst dasselbe glaube ich auch mit "apt-cache -a show" machen und stattdessen nach "^MD5sum:" oder "^SHA256:" greppen – zumindest in stretch erscheinen diese Werte nur bei über apt verfügbaren Paketen. Es funktioniert unter stretch gleich wie die "apt show"-Variante und ist sogar kürzer (aber nicht schneller :wink: ):

Code: Alles auswählen

for i in $(dpkg -l | grep '^i' | awk '{ print $2 }'); do apt-cache -a show $i | grep "^MD5sum:" > /dev/null || echo $i; done
Was da mit dem "grep -v" beim Kopieren und Einfügen passiert ist, weiß ich auch nicht - irgendwie habe ich da eine alte geteste und für kaputt befundene Version in der Zwischenablage gehabt. Dasselbe wäre mir übrigens um ein Haar bei diesem Beitrag wieder passiert - ich hab das Gefühl mein Clipboard ist kaputt.

Benutzeravatar
ThorstenS
Beiträge: 2801
Registriert: 24.04.2004 15:33:31

Re: Nur lokal installierte Pakete anzeigen

Beitrag von ThorstenS » 18.04.2018 14:16:56

Damit kannst du dir (ganz gemächlich) anzeigen lassen, woher ein Paket kommt:

Code: Alles auswählen

for i in $(aptitude search ~i -F "%p"); do apt-cache madison $i ; done
Wenn du den output auf 'file:' eingrenzt, dann siehst du das gewänschte Ergebnis.

deutlich flotter, aber von hinten durch die Brust ins Auge ist dieser Ansatz:

Code: Alles auswählen

# cron-apt ohne dpkg-repack installieren:
apt install apt-clone
apt-clone clone /tmp/ | grep "not installable"

Benutzeravatar
schorsch_76
Beiträge: 1783
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Nur lokal installierte Pakete anzeigen

Beitrag von schorsch_76 » 18.04.2018 15:10:32

Ah, sorry, das hab ich falsch verstanden ... :oops:

nudgegoonies
Beiträge: 805
Registriert: 16.02.2009 09:35:10

Re: Nur lokal installierte Pakete anzeigen

Beitrag von nudgegoonies » 18.04.2018 17:57:12

Hallo Smutbert. Deine letzte Lösung scheint jetzt zu ziehen. Allerdings sind die Pakete aus unterschiedlichen Repos alle untershiedlich mit Prüfsummen ausgestattet. Aber alle Pakete, die zu keinem Repo gehören, haben auf jeden Fall keine. Darum noch die Oders im Grep. Ein Problem war noch, dass die eigenen Backports wieder nicht gefunden wurden, weil apt-show dazu natürlich noch die Debian Pakete in Debian Repos mit Prüfsummen findet. Aber diese Zeile sollte es tun, da ich nach mehrmaligen ausprobieren herausgefunden habe, dass das momentan installierte Paket im ersten Block angezeigt wird. Darum noch das sed in der Zeile:

Code: Alles auswählen

for i in $(dpkg -l | grep '^i' | awk '{ print $2 }'); do apt-cache -a show $i | sed '/^$/q' | grep -e "^MD5sum" -e "^SHA1:" -e "^SHA256:" > /dev/null || echo $i; done
Danke Dir :THX:

Hallo schorsch_76 und ThorstenS. Danke für die Antworten. Ich will auf den über 100 Kisten nichts zusätzlich installieren. Darum die Suche nach einer Lösung, die mit einem Minimal-Debian funktioniert.
Soft: Stretch AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon 4670 MESA.
Hardware: Thinkstation S20, Intel X58, 8GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HD und DVD+RW.

Benutzeravatar
ThorstenS
Beiträge: 2801
Registriert: 24.04.2004 15:33:31

Re: Nur lokal installierte Pakete anzeigen [gelöst]

Beitrag von ThorstenS » 20.04.2018 09:03:23

Ok, das Argument verstehe ich. Hier mal eine klein wenig eingekürzte Version:

Code: Alles auswählen

for i in $(dpkg -l | awk '/^i/{ print $2 }'); do apt-cache -a show $i | sed '/^$/q' | egrep -q "^(MD5sum|^SHA(1|256):)" || echo $i; done

nudgegoonies
Beiträge: 805
Registriert: 16.02.2009 09:35:10

Re: Nur lokal installierte Pakete anzeigen [gelöst]

Beitrag von nudgegoonies » 21.04.2018 21:02:47

Danke Dir für die Optimierung. Awk und komplexe Regexe mit Operatoren sind bei mir noch Entwicklungsfelder.
Soft: Stretch AMD64, MATE Desktop. Repo's: Backports, kein Proposed, eigene Backports. Grafik: Radeon 4670 MESA.
Hardware: Thinkstation S20, Intel X58, 8GB, Xeon W3530, BCM5755 NIC, EMU10K1 SND, SATA SSD+HD und DVD+RW.

Antworten