Enumere las actualizaciones disponibles pero no las instale


209

Quiero que mi script de informes cron-run me notifique en caso de que haya actualizaciones para mis paquetes. ¿Es la forma de apt-getdarme la lista de actualizaciones disponibles pero no hacer nada más?

Respuestas:


231

apto

Para las versiones modernas de apthay un interruptor específico para esto:

apt list --upgradable

apt-get

Para el apt-getcomando anterior, el -uconmutador muestra una lista de paquetes disponibles para la actualización:

# apt-get -u upgrade --assume-no

Desde la apt-getpágina del manual :

-u
--show-updated
 Muestra paquetes actualizados; Imprima una lista de todos los paquetes que se actualizarán. Elemento de configuración: APT :: Get :: Show-Upgraded.
--assume-no  Automático "no" a todas las indicaciones. <== Para evitar que comience a instalarse

2
Esperaba que esto se pudiera hacer sin root
ThorSummoner

19
Si escribe "Y" y pulse Enter, este comando será instalar actualizaciones. Definitivamente recomendaría agregar "-s", de lo contrario esta respuesta es engañosa
Murmel

55
Esta es una respuesta muy incorrecta porque (sin opciones adicionales) el comando espera entrada y si el usuario ingresa la entrada incorrecta, el paquete se instala, lo que modifica el sistema, que no es lo que el OP quiere (solo sucedió en mi sistema)
Daniel Alder

Y por cierto: -ues una opción predeterminada deapt-get
Daniel Alder

1
@ThorSummoner '-s' hará lo que quieras y funciona sin root
nevelis

67
apt-get --just-print upgrade

No se lee tan fácilmente, a continuación hay un perl one liner para analizar la salida de apt-get:

apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}'

Esto debería generar algo como:

PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9

Esperemos que ayude a alguien más,


1
solo para reír: actualización de apt-get -s | awk -F '[] [()] +' '/ ^ Inst / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
tink

8
También podría ser mucho más bonito si se usa columnasí:apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}' | column -s " " -t
AntonioK

1
@AntonioK ¡Se ve genial!
nick

1
Me temo que este código Perl hackeará mi máquina ...;)
Chris

33

Otra opción, inspirada en enzotib:

aptitude search '~U' | wc -l

Este comando usará aptitude para generar los nuevos paquetes y luego wc para contar las líneas.

En una nota al margen, encontré que la solución de enzotib sin las comillas simples alrededor de la ~ U no funcionó para mí. (Wheezy, ZSH, aptitud 0.6.8.2)

Actualización:

Con el nuevo apt que puedes hacer ahora:

apt list --upgradable

Gracias por esto, el comando apt list fue exactamente lo que quería.
dvorak

Lo bueno de esta solución es que no necesitas sudo / root.
Gunni

25

Lo más fácil es:

apt list --upgradable

No funciona con menta.
ychaouche

1
Es una pena que esto no devuelva diferentes códigos de salida dependiendo de si hay actualizaciones disponibles o no. Hubiera sido bueno poder usar esto en un script.
Dale Anderson

18

Tu puedes correr

aptitude -F%p --disable-columns search ~U

o los indocumentados

/usr/lib/update-notifier/apt-check -p; echo

Otro método usando una apt-getsimulación:

apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'

1
Este comando de aptitud funcionó muy bien para mí y no requirió root
JamesCW 05 de

apt-get -s dist-upgrade funciona bien también y tiene el mismo resultado cuando lo canalizas a través de ese awker
ychaouche

¡gracias! Esto salió de un infierno de dependencia. estaba intentando dist-upgradepero no perder algunos paquetes que necesitaba usar aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')¡Hizo el truco!
Jayen

11

Echa un vistazo al paquete "apticron":

apticron: herramienta simple para enviar por correo sobre actualizaciones de paquetes pendientes

Apticron es un script simple que envía correos electrónicos diarios sobre actualizaciones de paquetes pendientes, como actualizaciones de seguridad, manejando adecuadamente los paquetes en espera tanto por dselect como por aptitude.

https://packages.debian.org/buster/apticron


Su enlace está roto ...
Alexis Wilke

10
apt-get update && apt-get -s upgrade

enumerará las actualizaciones disponibles sin instalar realmente.

El primer comando actualiza los archivos de índice del paquete antes de realizar la actualización simulada (por lo tanto, -s). "-s" realizará una actualización simulada que mostrará los paquetes que se instalarían pero que en realidad no instalarán nada.

Por el contrario, "-u" en lugar de "-s" en realidad se instalaría después de la confirmación.


2
La opción de simulación se puede activar con cualquiera de -s, --simulate, --just-print, --dry-run, --recon, --no-act, reconocimiento y ejecución en seco son mis favoritos personales.
ThorSummoner

9

Necesitaba información de la versión completa sobre posibles actualizaciones, así que utilicé una modificación de la respuesta de jasonwryan:

apt-get -V -u upgrade

Es una salida simple e IMO razonablemente formateada.


3

Simplemente filtre la salida de

apt-get update && apt-get -s -V -u upgrade

tener solo la información preferida en su registro.

Lo más probable es que necesites la parte hermosa después de la línea

...

Se actualizarán los siguientes paquetes:

...

que tiene pocos espacios al principio.


Hola y bienvenidos al sitio. Tal como está, su respuesta es básicamente una repetición de las existentes y, por lo tanto, no agrega nada nuevo. Se podría mejorarlo mediante, por ejemplo, explicar cómo filtrar la salida, añadiendo una explicación de lo que los diversos interruptores hacen etc
terdon

2

Jet otro en línea, inspirado por esta respuesta :

function a { read input;dpkg -l ${input} | grep " ${input} " | awk '{$1=$2=$3=$4="";print $0}' | sed 's/^ *//';unset input;};{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line $(echo $line | awk '{print $1}' | a )\n"; done;

La salida se ve así (coloreada):

locales (2.13-38+deb7u7 -> 2.13-38+deb7u8) Embedded GNU C Library: National Language (locale) data [support]
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Header files for Linux 3.2.0-4-amd64
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Common header files for Linux 3.2.0-4
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2) Provide limited super user privileges to specific users

Si no desea la breve descripción, use esta:

{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line\n"; done;

Salida:

locales (2.13-38+deb7u7 -> 2.13-38+deb7u8)
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2)

El único revestimiento es fantástico, excepto que no muestra la descripción de algunos paquetes.
ychaouche

2
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "

es el más simple para correos electrónicos cron; no hay iteración del usuario, y si no hay actualizaciones no hay salida.


1

Después de escribir una advertencia a la respuesta de @ jasonwryan, quiero proporcionar mi propia solución:

apt-get dist-upgrade --assume-no

Desafortunadamente, este no funciona con debian wheezy y tuve que verificar algunos contenedores lxc que aún no están actualizados. Este formulario siempre funcionará:

apt-get dist-upgrade </dev/null

Finalmente, también quería formatear la salida. Elegí cambiar la llamada nuevamente (usando --dry-runpero ignorando todas las salidas adicionales) porque se siente más seguro:

apt-get --dry-run dist-upgrade | awk '
BEGIN{p=0}
/^The/{p=1;t=$0}
/no longer required/{p=0}
#optional: /been kept back/{p=0}
p && t{print t;t=""}
/^  / && p{print $0}
'

Devoluciones:

The following packages have been kept back:
  iproute
The following packages will be upgraded:
  unzip

1

apt-check es probablemente el método de script más eficiente.

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 1

Una modificación muy pequeña muestra solo las actualizaciones de seguridad.

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 2

0

Como variación, uso lo siguiente:

apt-get -V -s dist-upgrade \
    |grep -E "^   .*=>.*" \
    |awk 'BEGIN {
        ul=sprintf("%*s",40,""); gsub(/ /,"-",ul);
        printf "%-30s %-30s %-30s\n", "Package", "Installed", "Available";
        printf "%-30.30s %-30.30s %-30.30s\n", ul, ul, ul;
     }
     {
        printf "%-30s %-30s %-30s\n",
               $1,
               substr($2,2),
               substr($4,1,length($4)-1)
     }'

Péguelo en un script llamado apt-updatesy luego puede llamar apt-updatespara obtener una lista de todas las actualizaciones, independientemente del usuario.

Aún necesita llamar apt-get updatecon acceso privilegiado.


la salida solo muestra el nombre del paquete (primera columna), la segunda columna siempre imprime "=" y la tercera columna siempre está vacía. Estoy en menta.
ychaouche


0

Me gusta usar esto:

apt-get -qq update && apt-get -qq -s upgrade

Obtiene una salida como esta:

Inst linux-base [3.5] (4.5~deb8u1 Debian-Security:8/oldstable [all])
Conf linux-base (4.5~deb8u1 Debian-Security:8/oldstable [all])

si hay actualizaciones disponibles, y ninguna si no las hay. De esta manera, simplemente puede combinarlo con una solución de monitoreo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.