Jak dokładnie sprawdzić, czy pakiet jest zainstalowany w yum?

56

Otrzymuję odpowiedzi takie jak:

yum list installed | grep bind

lub

rpm -qa | grep bind

Ale to nie jest dokładne, ponieważ otrzymuję listę kilku innych pakietów wiązania, takich jak te:

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

Nie tego chciałem. Zamiast tego chciałbym dokładnie sprawdzić, czy pakiet powiązania rdzenia został zainstalowany. Na przykład.bind.x86_64 32:9.8.2-0.17.rc1.el6_4.6

Miałem nadzieję na coś takiego:

yum check installed bind

Ale mam nadzieję, że ktoś może rzucić światło.

suma kontrolna
źródło

Odpowiedzi:

61

Próbowałeś tego?

$ yum list installed bind
plazmid87
źródło
Dostaję Error: No matching Packages to listi $?zwracam 1, a kiedy próbowałem yum list installed bind-libs, $?zwraca 0. Co powinno być jak dotąd poprawne. Czy mogę bezpiecznie stwierdzić, że twoje polecenie dokładnie określa, czy pakiet jest zainstalowany? rpm -q bindWłaśnie się dowiedziałem . Czy jest to również równoznaczne z twoim poleceniem?
suma kontrolna
To jest poprawne AFAIK, kod wyjścia 0 tylko, jeśli pakiet jest zainstalowany.
plazmid87
Myślę, że to działa. I lubię rozwiązania jednoliniowe.: D
suma kontrolna
Myślę, że poprawne polecenie ma symbol wieloznaczny: yum list installed bind*
Alejandro Angelico
2
@NoahSussman Możesz spróbować yum -C list installed binduniknąć sieci. Dzięki temu wszystkie wtyczki są włączone (na wypadek, gdybyś miał coś egzotycznego, co wpływa na wyszukiwania w yumdb), a także informuje o repo, z którego pakiet został zainstalowany
plasmid87
13

Jest o wiele łatwiejszy sposób na wydanie tego zapytania: rpm -qa | grep bindlub rpm -q bind. To pierwsze jest najlepsze, jeśli nie jesteś całkowicie pewien nazwy pakietu.

Jan
źródło
4
+1, ponieważ rpm -q $packageuważam, że jest to najszybsze i najszybsze rozwiązanie, ponieważ robienie czegokolwiek yummoże wymusić aktualizację pamięci podręcznej (zwykle powolne).
Alex S
To rozwiązanie (używanie rpm) powinno być akceptowaną odpowiedzią, ponieważ zwraca czysty status wyjścia i nie wymaga wywoływania wielu zdalnych adresów URL, jak yumrozwiązania.
Noah Sussman
1
@NoahSussman Kody wyjścia dla yumi rpmwykonaj to samo zachowanie we wszystkich przykładach mogę myśleć (0 = zainstalowany, 1 = Nie zainstalowano / Error), więc dobrze byłoby wiedzieć, czy widzisz inny kod wyjścia. Proszę spojrzeć na moją odpowiedź powyżej dotyczącą używania pamięci podręcznej w celu uniknięcia dostępu do sieci
plazmid87
@ plasmid87 Nie wiedziałem, że mógłbym użyć, yum -Caby zapobiec spędzaniu przez yum całego dodatkowego czasu na kontaktowaniu się z hostami sieciowymi. Dziękuję, teraz widzę, jak można używać wymiennie yum i rpm tutaj !!
Noah Sussman
9

Analiza wyników tego polecenia jest najbardziej kompletną odpowiedzią. Musisz znać dokładną nazwę pakietu.

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
źródło
2
Hmm, czy to nie mówienie, że bindjest dostępny / ważny pakiet yum zamiast mówić mi, czy jest zainstalowane?
suma kontrolna
2
Nie jest to oczywiste, ale jeśli zainstalowany jest wymieniony pod znacznikiem Repo, jest zainstalowany. W przeciwnym razie wyświetla listę repozytoriów, z których jest ona dostępna.
Fred the Magic Wonder Dog,
Powoduje to połączenie się ze zdalnymi repozytoriami yum, gdy wszystko, czego chcę, to zobaczyć, co się dzieje na mojej lokalnej maszynie.
Noah Sussman
1

Najlepszy linijka, jaką wymyśliłem, aby to zrobić (która jest świetna do szybkiego użycia w skryptach) to:

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

Na przykład: jeśli aktualnie gitzainstalowałem:

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

To wróci installed

Jeśli aktualnie nie mam gitzainstalowanej, ta sama poprzednia komenda zwróci: base/7/x86_64która jest bieżącą dostępną instalacjągit

domdambrogia
źródło
Powoduje to połączenie się ze zdalnymi repozytoriami yum, gdy wszystko, czego chcę, to zobaczyć, co się dzieje na mojej lokalnej maszynie.
Noah Sussman
1
@NoahSussman, aby wyświetlić listę wszystkich pakietów zainstalowanych obecnie na komputerze lokalnym, których możesz użyć yum list installed. Stamtąd możesz użyć greppolecenia, aby uzyskać dokładniejszą odpowiedź na to, czego szukasz. Również jeśli chcesz sprawdzić konkretny pakiet, możesz dodać go do swojego polecenia - np php70w. : yum list installed php70wNo matching Packages to list
wypisze
-1

Użyj kodu Python, aby sprawdzić, czy pakiet jest zainstalowany w Pythonie, używając yum:

def is_installed(package_name):
    return "not installed" in commands.getstatusoutput("rpm -q " + package_name)[1]
Eric Leschinski
źródło
nie powinno tak być not in?
Inbar Rose
-2
yum list installed bind >/dev/null ; echo $?

Jeśli wynikiem jest 0 (zero), pakiet jest instalowany

Tom Emerson
źródło
Jest to bardzo powolne w porównaniu do rpm -q bindrozwiązania pokazanego w odpowiedzi Johna.
Noah Sussman
Chociaż być może użycie yum -C ...byłoby szybkie.
Noah Sussman