Compruebe si todos los paquetes enumerados están instalados en bash

9

Mi binario depende de estas bibliotecas de impulso y sus respectivos paquetes:

NAME                                  |          PACKAGE:
--------------------------------------+-----------------------------------
libboost_serialization.so.1.55.0      |  libboost-serialization1.55.0
libboost_thread.so.1.55.0             |  ibboost-thread1.55.0
libboost_date_time.so.1.55.0          |  libboost-date-time1.55.0
libboost_signals.so.1.55.0            |  libboost-signals1.55.0

Entonces me gustaría definir una lista de paquetes:

boostlibnames="libboost-serialization1.55.0 libboost-thread1.55.0 libboost-date-time1.55.0 libboost-signals1.55.0"

Y ahora me gustaría comprobar si están todos instalados y solo si se ejecutan apt-get install. Sé que apt verificará automáticamente si los paquetes ya están instalados, pero me gustaría indicarle al usuario si desea instalar las bibliotecas faltantes antes de hacerlo.

Entonces, ¿hay una buena manera de verificar si están instaladas todas las bibliotecas enumeradas (en la variable anterior)?

Tomáš Zato - Restablece a Monica
fuente
Crear un paquete Debian adecuado y dejar que la manija apta las dependencias
ivanivan
@ivanivan Es una aplicación interna de la empresa y, por supuesto, no de código abierto.
Tomáš Zato - Restablece a Mónica el
No significa que tenga que distribuir el archivo deb o cualquier otra cosa más allá de su compañía interna ... solo use la resolución de dependencia de los sistemas de empaque. Diablos, use el método en este q / a para crear un paquete falso para instalar los departamentos - unix.stackexchange.com/questions/318117/…
ivanivan

Respuestas:

13

El dpkg -scomando devuelve el estado de los paquetes instalados. Por ejemplo, en mi sistema, si lo ejecuto para firefoxcuál está instalado y neditcuál no, obtengo:

$ dpkg -s firefox
Package: firefox
Status: install ok installed
Priority: optional
Section: web
Installed-Size: 94341
Maintainer: Clement Lefebvre <root@linuxmint.com>
Architecture: amd64
Version: 41.0~linuxmint1+betsy
Replaces: firefox-l10n-af, firefox-l10n-ar, firefox-l10n-be, firefox-l10n-bg, firefox-l10n-bn-bd, firefox-l10n-ca, firefox-l10n-cs, firefox-l10n-da, firefox-l10n-de, firefox-l10n-el, firefox-l10n-en-gb, firefox-l10n-en-us, firefox-l10n-eo, firefox-l10n-es, firefox-l10n-et, firefox-l10n-eu, firefox-l10n-fa, firefox-l10n-fi, firefox-l10n-fr, firefox-l10n-fy, firefox-l10n-gl, firefox-l10n-gu, firefox-l10n-he, firefox-l10n-hi, firefox-l10n-hr, firefox-l10n-hu, firefox-l10n-id, firefox-l10n-is, firefox-l10n-it, firefox-l10n-ja, firefox-l10n-kn, firefox-l10n-ko, firefox-l10n-lt, firefox-l10n-lv, firefox-l10n-nb, firefox-l10n-nl, firefox-l10n-nn, firefox-l10n-pl, firefox-l10n-pt, firefox-l10n-pt-br, firefox-l10n-ro, firefox-l10n-ru, firefox-l10n-sk, firefox-l10n-sl, firefox-l10n-sq, firefox-l10n-sr, firefox-l10n-sv, firefox-l10n-th, firefox-l10n-tr, firefox-l10n-uk, firefox-l10n-zh
Provides: gnome-www-browser, www-browser
Breaks: firefox-l10n-en-us
Description: The Firefox web browser
 The Mozilla Firefox Web Browser.

$ dpkg -s nedit
dpkg-query: package 'nedit' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.

Entonces, puede usar ese comando para verificar si un paquete está instalado:

#!/usr/bin/env bash

run_install()
{
    ## Prompt the user 
    read -p "Do you want to install missing libraries? [Y/n]: " answer
    ## Set the default value if no answer was given
    answer=${answer:Y}
    ## If the answer matches y or Y, install
    [[ $answer =~ [Yy] ]] && apt-get install ${boostlibnames[@]}
}

boostlibnames=("libboost-serialization1.55.0" "libboost-thread1.55.0"
                "libboost-date-time1.55.0" "libboost-signals1.55.0" "nedit")
## Run the run_install function if sany of the libraries are missing
dpkg -s "${boostlibnames[@]}" >/dev/null 2>&1 || run_install
terdon
fuente
¿Hay alguna forma corta de guardar resultados? P.ej. en C / C ++ lo haría installed = installed || isInstalled(libArray[i]). De manera similar, me gustaría poner falso en una variable si no se instalaron uno o más. Creo que puedo hacer esto if, pero eso es mucho código para nada.
Tomáš Zato - Restablece a Monica el
@ TomášZato sí, pero tendrás que ser más específico. ¿Desea guardar la lista de bibliotecas faltantes? ¿Es solo uno suficiente? Personalmente, solo verificaría si todos están instalados y, si al menos uno no, los ejecutaré apt-get install. Los que estén instalados simplemente serán ignorados. Déjame saber lo que quieres y lo editaré. Básicamente, necesitará cambiar el || echo ...to || installed=1o algo.
terdon
Quería hacer exactamente lo que haces, es un esfuerzo perdido para guardar la lista de bibliotecas faltantes. Simplemente verifíquelos todos y, si falta alguno, solicite al usuario apt-get. Ya obtuve su código trabajando con una ifdeclaración fea , pero se preferiría la variable. Planeo envolverlo en una función.
Tomáš Zato - Restablece a Monica el
@ TomášZato OK, eche un vistazo a la respuesta actualizada. Lo simplifiqué un poco, ya que dpkg -spuedo buscar varios paquetes a la vez.
terdon
1

Hice esta función para un sistema CentOS hoy.

#!/bin/bash

# List of the packages that should be present
list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")

# Check for the existence of the packages in the system and print to file.txt the packages to be installed
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { print $2}' > list.txt)

# Check if the list.txt is empty
grep -q '[^[:space:]]' < list.txt
EMPTY_FILE=$?
# If list.txt is empty there's nothing to do
if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

# If list.txt is not empty it installs the packages in list.txt

for PACKAGES in `cat /your/path/list.txt`; do

  yum install -y $PACKAGES

done

fi

Bueno, modifiqué ligeramente la función. Más rápido y ya no necesita un bucle.

#!/bin/bash


list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { printf $2" "}' > /your/path/to/list.txt)
install=$(cat /your/path/to/list.txt)

grep -q '[^[:space:]]' < /your/path/to/list.txt

EMPTY_FILE=$?

if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

yum install -y $install

fi

La contraparte de Debian / Ubuntu:

apt -qq YOUR_LIST_GOES_HERE | grep -v "installed" | awk -F/ '{print $1}' > /your/path/to/list.txt
packages=$(cat /your/path/to/list.txt)
grep -q '[^[:space:]]' < /your/path/to/list.txt
EMPTY_FILE=$?
if [[ $EMPTY_FILE -eq 1 ]]; then
echo "Nothing to do"
else
apt-get  install -y $packages
fi
Claudio Taccogna
fuente
0

Lo siguiente le dará una lista de todos los paquetes relevantes que no están instalados:

dpkg -l $boostlibnames 2>&1 | awk '{if (/^D|^\||^\+/) {next} else if(/^dpkg-query:/) { print $6} else if(!/^[hi]i/) {print $2}}' 

Esto omite dpkg -llas líneas de encabezado y luego imprime las líneas donde dpkg-query se queja de un paquete desconocido, Y las líneas que no comienzan con hio ii(Hold Inst o Install Inst).

Por lo general, me gustaría hacer algo parecido awk 'NR<=5 {next} ; ...'o sed -e '1,5d'para deshacerse de dpkg -l's líneas de cabecera, pero en este caso estamos redireccionamiento stderr a stdout con el fin de quejas de captura por dpkg-query, así como dpkg -l' s de salida, por lo que no se puede simplemente eliminar la primera 5 lineas.

Esto mostrará los paquetes que nunca se instalaron, eliminaron, purgaron o donde la instalación falló / se completó parcialmente debido a un error.

cas
fuente
0

Utilizo el siguiente código en mi trabajo llamado Easy Bash , que ayuda a instalar los paquetes más populares rápidamente en los servidores Ubuntu. Este código verificará los paquetes listados instalados o no.

#!/usr/bin/env bash

packages=("curl" "gnupg2" "ca-certificates" "lsb-release")

for pkg in ${packages[@]}; do

    is_pkg_installed=$(dpkg-query -W --showformat='${Status}\n' ${pkg} | grep "install ok installed")

    if [ "${is_pkg_installed}" == "install ok installed" ]; then
        echo ${pkg} is installed.
    fi
done

Resultado:

ingrese la descripción de la imagen aquí

Terry Lin
fuente
Bienvenido al sitio y gracias por su contribución. Aún así, evite publicar capturas de pantalla de la salida de la consola , y cópielo y páselo con el formato adecuado ...
AdminBee
-1
#to check package is installed or not without distribution dependency
#!/bin/bash
read -p "Package Name: " pkg
which $pkg > /dev/null 2>&1
if [ $? == 0 ]
then
echo "$pkg is already installed. "
else
read -p "$pkg is not installed. Answer yes/no if want installation_ " request
if  [ $request == "yes" ]
then
yum install $pkg
fi
fi
linux.cnf
fuente
La pregunta no era sobre verificar si un solo paquete ya está instalado.
guntbert