¿Cómo verificar con precisión si el paquete está instalado en yum?

56

Sigo recibiendo respuestas como:

yum list installed | grep bind

o

rpm -qa | grep bind

Pero eso no es exacto ya que obtengo una lista de algunos otros paquetes de enlace como estos:

bind-utils-9.8.2-0.17.rc1.el6_4.5.x86_64
rpcbind-0.2.0-11.el6.x86_64
bind-libs-9.8.2-0.17.rc1.el6_4.5.x86_64
samba-winbind-3.6.9-151.el6.x86_64
samba-winbind-clients-3.6.9-151.el6.x86_64
ypbind-1.20.4-30.el6.x86_64

Eso no es lo que quería. En cambio, me gustaría comprobar con precisión si se ha instalado el paquete Bind Core. P.ej.bind.x86_64 32:9.8.2-0.17.rc1.el6_4.6

Esperaba algo como:

yum check installed bind

Pero con suerte alguien podría arrojar la luz.

suma de comprobación
fuente

Respuestas:

61

¿Has probado esto?

$ yum list installed bind
plasmid87
fuente
Estoy obteniendo Error: No matching Packages to listy $?devuelve 1, y cuando lo intenté yum list installed bind-libs, $?devuelve 0. Lo que debería ser correcto hasta ahora. ¿Puedo concluir con seguridad que su comando es determinar con precisión un paquete instalado? Lo descubrí hace rpm -q bindun momento. ¿Es igual a su comando también?
suma de comprobación
Eso es correcto AFAIK, salga del código 0 solo si el paquete está instalado.
plasmid87
Creo que esto está funcionando. Y me gustan las soluciones de línea única.: D
suma de comprobación
Creo que el comando correcto es con un comodín: yum list installed bind*
Alejandro Angelico
2
@NoahSussman Puede intentar yum -C list installed bindevitar la red. Esto mantiene todos los complementos habilitados (en caso de que tenga algo exótico que afecte las búsquedas en yumdb) y también le informa el repositorio desde el que se instaló el paquete
plasmid87
13

Hay una forma mucho más fácil de emitir esta consulta: rpm -qa | grep bindo rpm -q bind. Lo primero es mejor si no está completamente seguro del nombre del paquete.

John
fuente
44
+1 porque rpm -q $packagecreo que esta es la solución más rápida, ya que hacer cualquier cosa yumpodría forzar una actualización de caché (generalmente lenta).
Alex S
Esta solución (usar rpm) debe ser la respuesta aceptada, ya que devuelve un estado de salida limpia y no requiere llamar a un grupo de URL remotas como lo yumhacen las soluciones.
Noah Sussman
1
@NoahSussman Los códigos de salida para yumy rpmsiguen el mismo comportamiento en todos los ejemplos que se me ocurren (0 = instalado, 1 = no instalado / error), por lo que sería útil saber si está viendo un código de salida diferente. Eche un vistazo a mi respuesta anterior sobre el uso de la memoria caché para evitar el acceso a la red
plasmid87
@ plasmid87 No sabía que podía usar yum -Cpara evitar que yum pasara todo ese tiempo extra contactando a los hosts de la red. ¡Gracias, ahora veo cómo yum y rpm se pueden usar indistintamente aquí!
Noah Sussman
9

Analizar los resultados de este comando es la respuesta más completa. Necesitará saber el nombre exacto del paquete.

yum info bind

Loaded plugins: refresh-packagekit, rhnplugin
This system is receiving updates from RHN Classic or RHN Satellite.
Installed Packages
Name        : bind
Arch        : x86_64
Epoch       : 32
Version     : 9.8.2
Release     : 0.17.rc1.el6_4.6
Size        : 7.3 M
Repo        : installed
From repo   : rhel-x86_64-workstation-6
Summary     : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
URL         : http://www.isc.org/products/BIND/
License     : ISC
Description : BIND (Berkeley Internet Name Domain) is an implementation of the DNS
        : (Domain Name System) protocols. BIND includes a DNS server (named),
        : which resolves host names to IP addresses; a resolver library
        : (routines for applications to use when interfacing with DNS); and
        : tools for verifying that the DNS server is operating properly.
Fred the Magic Wonder Dog
fuente
2
Hmm, ¿no es que decirme que bindestá disponible / paquete válido yum en lugar de decirme si está instalado?
suma de comprobación
2
No es obvio, pero si está instalado aparece en la etiqueta Repo, está instalado. De lo contrario, enumeraría el repositorio del que está disponible.
Fred the Magic Wonder Dog
Esto da como resultado la conexión a repositorios remotos yum cuando todo lo que quiero es ver lo que está sucediendo en mi máquina local .
Noah Sussman
1

El mejor delineador que se me ocurrió para hacer esto (que es excelente para usar rápidamente en los scripts) es:

yum info <package_name> | grep Repo | awk '{ print $3 }'

Por ejemplo: si actualmente tengo gitinstalado:

yum info git | grep Repo | awk '{ print $3 }'

Esto volverá installed

Si actualmente no tengo gitinstalado, ese mismo comando anterior volverá: base/7/x86_64cuál es la instalación disponible actual paragit

domdambrogia
fuente
Esto da como resultado la conexión a repositorios remotos yum cuando todo lo que quiero es ver lo que está sucediendo en mi máquina local .
Noah Sussman
1
@NoahSussman para enumerar todos los paquetes instalados actualmente en su máquina local que puede usar yum list installed. Desde allí, puede usar el grepcomando para obtener una respuesta más precisa de lo que está buscando. Además, si quieres para comprobar si hay un paquete específico se puede añadir que a su comando - Ex: php70w. yum list installed php70wenumeraría la información en el paquete instalado o regresaríaNo matching Packages to list
domdambrogia
-1

Use el código de Python para verificar si un paquete está instalado en python usando yum:

def is_installed(package_name):
    return "not installed" in commands.getstatusoutput("rpm -q " + package_name)[1]
Eric Leschinski
fuente
no debería ser esto not in?
Inbar Rose
-2
yum list installed bind >/dev/null ; echo $?

Si el resultado es 0 (cero), el paquete está instalado

Tom Emerson
fuente
Esto es muy lento en comparación con la rpm -q bindsolución que se muestra en la respuesta de John.
Noah Sussman
Aunque quizás usarlo yum -C ...sería rápido.
Noah Sussman