Respuestas:
Para las versiones modernas de apt
hay un interruptor específico para esto:
apt list --upgradable
Para el apt-get
comando anterior, el -u
conmutador muestra una lista de paquetes disponibles para la actualización:
# apt-get -u upgrade --assume-no
Desde la apt-get
pá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
-u
es una opción predeterminada deapt-get
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,
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
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
Lo más fácil es:
apt list --upgradable
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-get
simulación:
apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
dist-upgrade
pero no perder algunos paquetes que necesitaba usar aptitude
. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
¡Hizo el truco!
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.
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.
-s, --simulate, --just-print, --dry-run, --recon, --no-act
, reconocimiento y ejecución en seco son mis favoritos personales.
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.
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)
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.
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-run
pero 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
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
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-updates
y luego puede llamar apt-updates
para obtener una lista de todas las actualizaciones, independientemente del usuario.
Aún necesita llamar apt-get update
con acceso privilegiado.
Ahí está la apt-show-versions
herramienta. Para mostrar las actualizaciones disponibles, ejecute:
apt-show-versions -u
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.