Wie kann ich überprüfen, ob ein Paket installiert ist (keine Superuser-Berechtigungen)?

56

An unserer Universität können wir fast jedes Ubuntu-Paket installieren, das wir möchten, aber wir sind selbst keine Superuser (wir müssen anfordern, dass Pakete installiert werden).

Bei einigen Bibliotheken ist es nicht immer einfach zu erkennen, ob das Paket bereits installiert ist oder nicht. Gibt es einen einfachen Weg / Befehl, um dies zu überprüfen?

Peter Smit
quelle

Antworten:

56
apt-cache policy <package name>
Oli
quelle
7
Es ist wichtig zu wissen, dass es das Ausfüllen von Tabulatoren im Paketnamen unterstützt. Es ist also sehr nützlich, auch wenn Sie den genauen Paketnamen nicht kennen.
Javier Rivera
Schade, dass mit Status 0 auch dann noch Schluss ist, wenn das Paket nicht vorhanden ist. dpkg -sfunktioniert jedoch: askubuntu.com/a/1108801/52975
Ciro Santilli am
Mit freundlicheremapt : apt policy <package name>oder apt show <package name>für mehr Info.
Pablo A
18

Ich benutze das immer nur von der Kommandozeile aus:

dpkg -l | grep mysql

Daher fordert der obige Befehl dpkg auf, alle installierten Pakete aufzulisten, und dann greife ich nur auf diejenigen zu, die mysql im Namen haben.

Rick
quelle
3
dpkg -l "*mysql*"funktioniert auch und verbirgt nicht die erklärenden Zeilen in der Ausgabe.
Philipp Wendler
dpkg -l "*mysql*"(oder dpkg -l '*mysql*') formatiert auch die Ausgabe so, dass jedes Paket in eine Zeile des Terminalfensters passt (grep nicht). In diesem Formular können Sie das Platzhalterformat (Präfixe oder Suffixe) auswählen und festlegen, ob überhaupt Platzhalter verwendet werden sollen (im Vergleich zu grep). Aber grep gibt schöne Färbung ..))
vstepaniuk
7

Eine weitere Variante, die diesmal aptitude verwendet:

aptitude show <package>

Die Tab-Vervollständigung funktioniert auch hier.

Alexey Nedilko
quelle
6

Sie können dselect verwenden. Es bietet nicht-su schreibgeschützten Zugriff.

Außerdem dpkg -s <package name>bietet eine Menge Details zu einem Paket zusammen. Z.B"

userme:~$ dpkg-query -s sl
Package: sl
Status: unknown ok not-installed
Priority: optional
Section: games
Abhinav
quelle
Dies ist auch nur als verfügbar dpkg -s. Und umgekehrt, dpkg-query -lfunktioniert genauso gut wiedpkg -ldpkg --list
belacqua
4

Sie können es dpkg-query -s <package> 2>/dev/null | grep -q ^"Status: install ok installed"$ in Skripten verwenden, da es den Exit-Code 1 zurückgibt, wenn das <package>nicht installiert ist, und 0, wenn das <package>installiert ist.

jarno
quelle
4
Achtung : Wenn das dpkg -sProdukt zurückgegeben wird 0, bedeutet dies nicht unbedingt, dass das Paket vollständig / korrekt installiert ist. dpkg -sGibt auch zurück, 0wenn das Paket in half-configuredoder im config-filesStatus ist (und ich denke auch in half-installed, aber ich habe das nicht überprüft). Weitere "unvollständige" Status finden Sie auf der Manpage von dpkg( manpages.ubuntu.com/manpages/oneiric/man1/dpkg.1.html ).
Zündgerät
1
@Ignitor, guter Punkt. Meine Antwort war falsch. Das Paket konnte sogar entfernt, aber nicht gelöscht werden. Ich denke, Sie müssen die Ausgabe untersuchen, um zu prüfen, ob das Paket installiert ist oder nicht.
Jarno
2
Ich habe die Antwort bearbeitet. Jetzt ist es auf die Ausgabe von dpkg-query angewiesen. Ich weiß nicht, wie portabel diese Lösung ist. Kann der Text beispielsweise in einem System in einer anderen Sprache angezeigt werden?
Jarno
2

Einfachere Lösung:

Es gibt jetzt einen apt listBefehl, der installierte Pakete auflistet. Sie können auch mit nach einem bestimmten Paket suchen

apt list <package>

Siehe man aptfür weitere Informationen.

sk8forether
quelle
1
Und apt showfür weitere Details
wjandrea
0

dpkg -s programmatische Nutzung

Ich mag dpkg -ses, 1wenn es mit Status beendet wird, wenn eines der Pakete nicht installiert ist, was es einfach macht, es zu automatisieren:

pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
  sudo apt-get install $pkgs
fi

Siehe auch:

Getestet unter Ubuntu 18.10.

Ciro Santilli ist ein Schauspieler
quelle
0

Beispiel für die Verwendung eines bestimmten Wertes als var in Shellskripten (zB test.sh)

#!/bin/sh
PACKAGE="${1}"
INSTALLED=$(dpkg -l | grep ${PACKAGE} >/dev/null && echo "yes" || echo "no")

echo "${PACKAGE} is installed ... ${INSTALLED}"

Mach es ausführbar und beginne mit:

test.sh openssh-server

Oder machen Sie mit Ihren Skripten, was Sie wollen

Lahmizzar
quelle
0

Sie müssen den Status überprüfen, der gedruckt wird dpkg -l, zum Beispiel durch:

$ dpkg -l firefox-esr vim winff
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                 Version                 Architecture            Description
+++-====================================-=======================-=======================-=============================================================================
hi  firefox-esr                          52.9.0esr+build2-0ubunt amd64                   Safe and easy web browser from Mozilla
ii  vim                                  2:8.1.1198-0york0~14.04 amd64                   Vi IMproved - enhanced vi editor
rc  winff                                1.5.3-3                 all                     graphical video and audio batch converter using ffmpeg or avconv

Hier werden beide vimund firefox-esrinstalliert, daher können Sie Folgendes eingeben:

$ dpkg -l firefox-esr | grep -q ^.i && echo This package is installed. || echo This package is NOT installed.
This package is installed.
$ dpkg -l vim | grep -q ^.i && echo This package is installed. || echo This package is NOT installed.
This package is installed.
$ dpkg -l winff | grep -q ^.i && echo This package is installed. || echo This package is NOT installed.
This package is NOT installed.
SebMa
quelle