So listen Sie Dateien eines Debian-Pakets ohne Installation auf

284

Dieser Befehl kann nur den Inhalt installierter Pakete auflisten.

dpkg -L PACKAGENAME

Aber wie kann man den Inhalt eines nicht installierten Pakets auflisten, um eine Vorschau des Pakets zu erhalten oder es zu untersuchen?

Xiè Jìléi
quelle
Ähnliches gilt für Ubuntu: askubuntu.com/questions/32507/…
Ciro Santilli

Antworten:

340

dpkg -c(oder --contents) listet den Inhalt einer .deb-Paketdatei auf (es handelt sich um ein Front-End für dpkg-deb.)

dpkg -c package_file.deb

Um direkt mit Paketnamen anstatt mit Paketdateien zu arbeiten, können Sie verwenden apt-file. (Möglicherweise müssen Sie das apt-filePaket zuerst installieren .)

sudo apt-file update        
apt-file list package_name

Wie im ersten Kommentar angegeben, listet apt-file den Inhalt für Pakete in Ihren bereits konfigurierten Apt-Repositorys auf. Es ist unerheblich, ob ein bestimmtes Paket installiert ist oder nicht.

Alfplayer
quelle
17
apt-file muss ebenfalls aktualisiert werden ( sudo apt-file update) und listet nur Inhalte für Pakete in Ihren bereits konfigurierten Apt-Repositories auf.
Quack Quijote
1
@quackquixote: In Ubuntu 12.04 ist es automatisch
confiq
1
dpkg -cnett!
d -_- b
2
Bei der Antwort auf die Apt-Datei wird davon ausgegangen, dass Ihr Paket aus einem konfigurierten Repository stammt und nicht aus einer .debDatei, die Sie separat heruntergeladen haben. Die ursprüngliche Frage ist jedoch nicht eindeutig.
Zoredache
5
@confiq, nicht von mir getestet. Ich lasse 12.04.4 laufen und es steht immer noch "E: Der Cache ist leer. Sie müssen zuerst 'apt-file update' ausführen."
Matthew Flaschen
58

Verwenden Sie --contentsanstelle von -L:

dpkg --contents PACKAGENAME

Dient bei Verwendung auf diese Weise dpkgals Front-End für dpkg-deb. Verwenden Sie man dpkg-debdiese Option, um alle Optionen anzuzeigen.

Sie können auch einen Archiv-Browser verwenden, um den Paketinhalt anzuzeigen.

Quacksalber
quelle
2
Dies funktioniert nur, wenn ich es zuerst installiert und dann deinstalliert habe.
Xiè Jìléi
3
Es sollte gut funktionieren, wenn Sie ihm eine .deb-Datei als Argument geben (anstelle von PACKAGENAME geben Sie es PACKAGE-DEB-FILE).
Quacksalber 15.
3
Diese Antwort ist falsch. Sie müssen das Paket zuerst installiert haben. Wenn Sie es nicht installiert haben, haben Sie keine .deb-Datei.
Neil
Dieser Befehl funktioniert bei mir. Zum Beispiel habe ich google-chrome-stable_current_amd64.deb von Google heruntergeladen. Dann gab er den Befehl: aus dpkg --contents google-chrome-stable_current_amd64.debund listete alle Dateien auf, die er installieren wird (hauptsächlich für /opt/google/chrome), von denen derzeit keine auf meinem System installiert ist, während ich dies tippe. (Ich verwende Xubuntu 11.10, wenn es darauf ankommt.)
quux00
10
@Neil, die Antwort ist nicht falsch. Nur weil Sie eine Deb-Datei haben, heißt das nicht, dass sie installiert ist. apt-file benötigt das gesamte Build-Essential-Paket. OO
d -_- b
21

dpkg --contentsMit dieser Option können Sie das deinstallierte Paket anzeigen. Wenn sich die .deb noch nicht auf Ihrem System befindet, tun Sie dies

apt-get --download-only install pkgname

Das Paket wird heruntergeladen, /var/cache/apt/archivesaber nicht installiert.

Rudedog
quelle
3
Kann ich den Inhalt einfach auflisten, ohne ihn herunterzuladen? Wenn ich eine sehr langsame Verbindung habe und das Paket zum Herunterladen zu groß ist. Wenn die .deb-Datei einen Dateikopf hat, in dem sich die Inhaltsliste befindet, ist das Herunterladen des gesamten Pakets möglicherweise nicht erforderlich. Ist das möglich?
Xiè Jìléi
13

Am besten durchsuchen Sie das Paket-Repository direkt:

http://packages.debian.org/[distro name]/all/[package name]/filelist

Beispiel:

http://packages.debian.org/wheezy/all/transmission-common/filelist

Baldoz
quelle
Und um das Verlassen des Terminals zu vermeiden, können Sie zB lynx -dump -nolist http://packages.debian.org/wheezy/all/transmission-common/filelist | grep ^/(sofern Sie lynxinstalliert haben) verwenden.
Ruslan
8

Ich nahm die http-Idee von @ baldoz und verallgemeinerte sie für Ubuntu und Debian, fügte ein wenig hinzu sedund wickelte sie in eine Bash-Funktion ein:

function deb_list () { curl -s $(lsb_release -si | sed -e 's Ubuntu https://packages.ubuntu.com ' -e 's Debian https://packages.debian.org ')/$(lsb_release -sc)/all/$1/filelist | sed -n -e '/<pre>/,/<\/pre>/p' | sed -e 's/<[^>]\+>//g' -e '/^$/d'; }

Verwendungszweck:

$ deb_list curl
/usr/bin/curl
/usr/share/doc/curl/changelog.Debian.gz
/usr/share/doc/curl/copyright
/usr/share/doc/curl/NEWS.Debian.gz
/usr/share/man/man1/curl.1.gz

Gleiche Funktion in mehreren Zeilen:

function deb_list () {
    curl -s $(lsb_release -si \
                | sed -e 's Ubuntu https://packages.ubuntu.com ' \
                      -e 's Debian https://packages.debian.org '
              )/$(lsb_release -sc)/all/$1/filelist \
      | sed -n -e '/<pre>/,/<\/pre>/p' \
      | sed -e 's/<[^>]\+>//g' -e '/^$/d';
}

Erklärt:

  1. lsb_release -si gibt "Ubuntu" oder "Debian" zurück und ersetzt dies durch die Basis-URL https://packages.ubuntu.comoderhttps://packages.debian.org
  2. lsb_Release -sc gibt den Codenamen zurück (z. B. "trusty", "sid" usw.) und verwendet diesen, um die vollständige URL zu erstellen: https://packages.ubuntu.com/trusty/all/curl/filelist
  3. Rufen Sie diese URL mit curl ab und leiten Sie den HTML-Code durch drei sed-Befehle. Zuerst wird nur die Dateiliste erfasst (was zwischen <pre>und </pre>Tags ist). Zweitens werden alle HTML-Tags entfernt. Drittel entfernt alle Leerzeilen.

Hinweis: Es werden keine PPAs, alternativen Apt-Quellen-Repos und nur die offiziellen Pakete abgefragt, die für die Veröffentlichung von Debian / Ubuntu, das Sie ausführen, verfügbar sind.

notpeter
quelle
Brauche ich Ruby, um es laufen zu lassen?
Anwar
1
@Anwar, ich hatte ursprünglich Ruby verwendet, weil ich faul war und mehrzeilige reguläre Ausdrücke sed / awk / grep einsaugen. Aber ich habe es umgeschrieben, um zwei sed-Befehle zu verwenden, kein Ruby erforderlich.
Notpeter
Nett! Dies ist die Antwort, die ich gesucht habe
Anwar
4

Für all jene Leute, die diese Ausgabe im Januar 2017 noch googeln, können Sie einige coole Sachen mit den neuesten Versionen von apt und dpkg in Debian 8.5 haben, ohne etwas herunterzuladen.

Auflisten des Inhalts der Deb-Datei ohne Download:

Suchen Sie zuerst die vollständige URL der Deb-Datei:

root@debian:apt-get --print-uris download yade
'http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb' yade_2016.06a-7_amd64.deb 1621148 SHA256:26c0d84484a92ae9c2828edaa63243eb764378d79191149970926aa3ec40cdd4

PS: --print-uris switch druckt die URL des deb-Pakets, aber deb wird nicht heruntergeladen.

Zeigen Sie dann den Inhalt des deb-Pakets an, ohne es herunterzuladen:

root@debian:curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb" |dpkg-deb -c /dev/stdin
drwxr-xr-x root/root         0 2016-12-10 22:18 ./
drwxr-xr-x root/root         0 2016-12-10 22:18 ./usr/
drwxr-xr-x root/root         0 2016-12-10 22:18 ./usr/bin/
-rwxr-xr-x root/root     13184 2016-12-10 22:18 ./usr/bin/yade
.........................more files listed bellow ......................

PS: Gleiches Ergebnis kann mit erzielt werden

root@debian:dpkg -c <(curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb")

Extrahieren Sie eine Datei aus dem obigen Deb-Paket, ohne sie herunterzuladen.
Zum Beispiel möchten wir die Manpage des Pakets yade lesen, ohne dieses Paket zu installieren und ohne das deb-Paket herunterzuladen.

Dateiname der Manpage im deb-Paket laut Empfehlung von dpkg -cist./usr/share/man/man1/yade.1.gz

Manpage on the fly lesen:

root@debian:curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb" |dpkg-deb --fsys-tarfile /dev/stdin |tar -xO ./usr/share/man/man1/yade.1.gz |man /dev/stdin

Die Manpage wird mit der Man-Anwendung korrekt angezeigt.

PS: Die obigen Pipes funktionieren nicht mit dem Befehl ar.

root@debian:apt --version --> apt 1.4~beta2 (amd64)
root@debian:dpkg --version --> Debian 'dpkg' package management program version 1.18.18 (amd64).
root@debian:man --version --> man 2.7.6.1
root@debian:tar --version --> tar (GNU tar) 1.29
George Vasiliou
quelle
Diese Beschreibung funktioniert für Systeme, die nur "apt" verwenden und nicht über die älteren "apt-x" -Befehle verfügen!
Jon Watte
2

Versuchen:

apt-get download packages-name
dpkg --contents *.deb
readanon
quelle
1

Es scheint nicht möglich zu sein, bevor Sie es zuerst installiert oder die Liste aus der .debDatei extrahiert haben .

Versuchen Sie den folgenden Befehl:

dpkg --contents <(curl -s $(apt-get install --yes --no-download --reinstall --print-uris language-pack-en | tail -n1 | grep -o "http[^']\+"))

Ändern Sie language-pack-enmit Ihrem Paketnamen.

Es liest grundsätzlich .debDateien, die über extrahiert curlund darauf ausgeführt werden dpkg --contents FILE.


Sie können den Inhalt auch überprüfen, ohne die Paketdatei herunterzuladen.

Wenn Sie die URL der .debDatei kennen, listet der folgende Shell-Befehl alle Paketdateien auf:

dpkg -c <(curl -sL "http://httpredir.debian.org/debian/pool/main/a/avis/avis_1.2.2-4_all.deb")

Curl-Parameter: -s- lautlos, -L- bewegten Links folgen.

Wenn Sie die URL nicht kennen, rufen Sie sie ab mit: apt --print-urisz

apt --print-uris install avis | grep avis
Kenorb
quelle