Quiero que mi secuencia de comandos de informes cron-run me notifique en caso de que haya actualizaciones para mis paquetes. ¿Es la forma de hacer que apt-get
me dé la lista de actualizaciones disponibles pero no haga nada más?
Responder
apt
Para las versiones modernas de apt
hay un interruptor específico para esto:
apt list --upgradable
apt-get
Para el antiguo comando apt-get
el -u
muestra una lista de paquetes que están disponibles para actualización:
# apt-get -u upgrade --assume-no
Desde apt-get
página de manual :
-u
–show- actualizado Mostrar paquetes actualizados; Imprima una lista de todos los paquetes que se actualizarán. Elemento de configuración: APT :: Get :: Show-Upgraded.
–assume-no «no» automático a todas las solicitudes. & lt == Para evitar que comience a instalarse
Comentarios
Responder
apt-get --just-print upgrade
No se lee tan fácilmente , a continuación se muestra una línea de perl 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
Con suerte, ayudará a alguien más,
Comentarios
- j ust para la risa: actualización de apt-get -s | awk -F ‘ [] [()] + ‘ ‘ / ^ Inst / {printf » Prog:% s \ tcur:% s \ tavail:% s \ n «, $ 2, $ 3, $ 4} ‘
- También podría ser mucho más atractivo, si usa
column
así: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 ¡Se ve genial!
- Yo ‘ me temo que este código Perl hackeará mi máquina. .;)
- @AntonioK ¿Cómo clasifica los nombres de los programas alfabéticamente?
Responder
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 ~U
no funcionó para mí. (Wheezy, ZSH, aptitude 0.6.8.2)
Actualización:
Con el nuevo apto puedes hacer:
apt list --upgradeable
Comentarios
- Gracias por esto, el comando apt list era exactamente lo que quería.
- Lo bueno con esta solución es que no necesita sudo / root.
Respuesta
La más fácil es:
apt list --upgradeable
Comentarios
- no funciona en mint.
- Es ‘ una pena que esto no ‘ t devuelve diferentes códigos de salida dependiendo de si hay actualizaciones disponibles o no. Hubiera sido bueno poder usar esto en un script.
Respuesta
Puede ejecutar
aptitude -F%p --disable-columns search ~U
o los indocumentados
/usr/lib/update-notifier/apt-check -p; echo
Otro método que usa un apt-get
simulación:
apt-get -s dist-upgrade | awk "/^Inst/ { print $2 }"
Comentarios
- Este comando aptitude funcionó muy bien para mí y no requiere root
- apt-get -s dist-upgrade también funciona bien y tiene el mismo resultado cuando lo canaliza a través de ese awker
- ¡gracias! esto salió de un infierno de dependencia. intentaba
dist-upgrade
pero no perder algunos paquetes, por lo que necesitaba usaraptitude
. ¡aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
hizo el truco!
Respuesta
Eche un vistazo al paquete «apticron»:
apticron – Simple herramienta para enviar correos electrónicos 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 correctamente los paquetes en espera tanto por dselect y aptitude.
https://packages.debian.org/buster/apticron
Comentarios
- Su enlace está roto …
Responder
apt-get update && apt-get -s upgrade
enumerará las actualizaciones disponibles sin instalarlas realmente.
El primer comando actualiza los archivos de índice del paquete antes de que se realice la actualización simulada (por lo tanto, -s) hecho. «-s» hará una actualización simulada mostrando los paquetes que se instalarían pero que en realidad no instalarán nada.
Por el contrario, «-u» en lugar de «-s» se instalaría después de la confirmación.
Comentarios
- La opción de simulación se puede activar con cualquiera de
-s, --simulate, --just-print, --dry-run, --recon, --no-act
, el reconocimiento y la ejecución en seco son mi favoritos personales.
Respuesta
Necesitaba información de la versión completa sobre posibles actualizaciones, así que utilicé una modificación de jasonwryan «s respuesta:
apt-get -V -u upgrade
Es una salida simple y en mi opinión razonablemente formateada.
Respuesta
Simplemente filtre la salida de
apt-get update && apt-get -s -V -u upgrade
para tener solo la información preferida en su registro.
Lo más probable es que necesite la parte hermosa después de la línea
…
Se actualizarán los siguientes paquetes:
…
que tiene pocos espacios al principio.
Comentarios
- Hola y bienvenido al sitio. Tal como está, su respuesta es básicamente una repetición de las existentes y, por lo tanto, no agrega nada nuevo. Puede mejorarlo, por ejemplo, explicando cómo filtrar la salida, agregando una explicación de lo que hacen los distintos conmutadores, etc.
Respuesta
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "
es el más simple para los correos electrónicos cron; no hay iteración del usuario, y si no hay actualizaciones, no hay salida.
Responder
Jet otro en línea, inspirado en 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;
El resultado se ve así (coloreado):
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 descripción breve, utilice 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;
Resultado:
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)
Comentarios
- La única línea es fantástica, excepto que no ‘ t muestra la descripción de algunos paquetes.
Respuesta
apt-check
es probablemente el método de scripting más eficiente.
/usr/lib/update-notifier/apt-check 2>&1 | cut -d ";" -f 1
Una pequeña modificación muestra solo las actualizaciones de seguridad.
/usr/lib/update-notifier/apt-check 2>&1 | cut -d ";" -f 2
Respuesta
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 comprobar algunos contenedores lxc que todavía no están actualizados. Este formulario siempre funcionará:
apt-get dist-upgrade </dev/null
Finalmente, también quería reformatear la salida. Elegí cambiar la llamada nuevamente (usando --dry-run
pero ignorando todos los resultados 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} "
Devuelve:
The following packages have been kept back: iproute The following packages will be upgraded: unzip
Respuesta
Me gusta usar esto:
apt-get -qq update && apt-get -qq -s upgrade
Obtienes un resultado como este:
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 ninguno si no lo hay. De esta manera, simplemente puede combinarlo con una solución de monitoreo.
Responder
Como variación Utilizo 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-updates
y luego puede llamar a apt-updates
para obtener una lista de todas las actualizaciones independientemente del usuario.
Aún necesita llamar a apt-get update
con acceso privilegiado.
Comentarios
- la salida solo muestra el nombre del paquete (primera columna), la segunda columna siempre imprime = » y la tercera columna siempre está vacía. Yo ‘ estoy en Mint.
Responder
Ahí » s la herramienta apt-show-versions
. Para mostrar las actualizaciones disponibles, ejecute:
apt-show-versions -u
-u
es una opción predeterminada deapt-get