58 votes

Comment puis-je vérifier si un paquet est installé (sans privilèges de superutilisateur) ?

Dans notre université, nous pouvons faire installer presque tous les paquets ubuntu que nous voulons, mais nous ne sommes pas nous-mêmes des super-utilisateurs (nous devons demander l'installation de paquets).

Avec certaines bibliothèques, il n'est pas toujours facile de savoir si le paquet est déjà installé ou non. Existe-t-il un moyen simple ou une commande pour le vérifier ?

2voto

dpkg-query --showformat='${db:Status-Status}'

Cela produit une petite chaîne de sortie qui n'est pas susceptible de changer et qui est facile à comparer de manière déterministe sans grep :

pkg=hello
status="$(dpkg-query -W --showformat='${db:Status-Status}' "$pkg" 2>&1)"
if [ ! $? = 0 ] || [ ! "$status" = installed ]; then
  sudo apt install $pkg
fi

En $? = 0 est nécessaire car si vous n'avez jamais installé un paquet auparavant, et après avoir supprimé certains paquets tels que hello , dpkg-query quitte avec le statut 1 et sort sur stderr :

dpkg-query: no packages found matching hello

au lieu de sortir not-installed . En 2>&1 capte également ce message d'erreur lorsqu'il s'agit d'empêcher le passage au terminal.

Pour les paquets multiples :

pkgs='hello certbot'
install=false
for pkg in $pkgs; do
  status="$(dpkg-query -W --showformat='${db:Status-Status}' "$pkg" 2>&1)"
  if [ ! $? = 0 ] || [ ! "$status" = installed ]; then
    install=true
    break
  fi
done
if "$install"; then
  sudo apt install $pkgs
fi

Les statuts possibles sont documentés dans man dpkg-query comme :

   n = Not-installed
   c = Config-files
   H = Half-installed
   U = Unpacked
   F = Half-configured
   W = Triggers-awaiting
   t = Triggers-pending
   i = Installed

Les versions à une seule lettre sont disponibles avec db:Status-Abbrev mais ils sont associés à l'action et à l'état d'erreur, ce qui donne 3 caractères et nécessite de les couper.

Je pense donc qu'il est suffisamment fiable de se fier aux statuts non capitalisés ( Config-files vs config-files ) ne change pas à la place.

dpkg -s statut de sortie

Malheureusement, cela ne répond pas aux attentes de la plupart des utilisateurs :

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

car pour certains paquets, par exemple certbot , faire :

sudo apt install certbot
sudo apt remove certbot

feuilles certbot en état config-files ce qui signifie que les fichiers de configuration ont été laissés dans la machine. Et dans cet état, dpkg -s revient toujours 0 car les métadonnées du paquet sont toujours conservées afin que les fichiers de configuration puissent être gérés de manière plus efficace.

Pour faire réellement dpkg -s retourner 1 comme souhaité, --purge serait nécessaire :

sudo apt remove --purge certbot

qui le déplace en fait dans not-installed / dpkg-query: no packages found matching .

Notez que seuls certains paquets laissent des fichiers de configuration derrière eux. Un paquet plus simple comme hello va directement de installed a not-installed sin --purge .

Testé sur Ubuntu 20.10.

Python apt paquet

Il existe un paquetage Python 3 pré-installé appelé apt dans Ubuntu 18.04 qui expose une interface apt Python !

Un script qui vérifie si un paquet est installé et l'installe sinon peut être vu à : https://stackoverflow.com/questions/17537390/how-to-install-a-package-using-the-Python-apt-api/17538002#17538002

Voici une copie à titre de référence :

#!/usr/bin/env python
# aptinstall.py

import apt
import sys

pkg_name = "libjs-yui-doc"

cache = apt.cache.Cache()
cache.update()
cache.open()

pkg = cache[pkg_name]
if pkg.is_installed:
    print "{pkg_name} already installed".format(pkg_name=pkg_name)
else:
    pkg.mark_install()

    try:
        cache.commit()
    except Exception, arg:
        print >> sys.stderr, "Sorry, package installation failed [{err}]".format(err=str(arg))

Vérifier si un exécutable est dans PATH au lieu de

Voir : https://stackoverflow.com/questions/592620/how-can-i-check-if-a-program-exists-from-a-bash-script/22589429#22589429

Voir aussi

2voto

sk8forether Points 267

Une solution plus simple :

Il existe désormais un apt list qui liste les paquets installés. Vous pouvez également rechercher un paquet spécifique avec

apt list <package>

Véase man apt pour plus d'informations.

0voto

pavid Points 849

Vous devez vérifier l'état imprimé par dpkg -l , exemple :

$ 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

Ici, les deux vim y firefox-esr sont installés, vous pouvez donc taper :

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

-1voto

Lahmizzar Points 99

Exemple pour utiliser une valeur spécifique comme var dans Shell Shell (ex. test.sh )

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

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

Rendez-le exécutable et démarrez-le avec :

test.sh openssh-server

Ou faites ce que vous voulez dans vos scripts.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X