¿Cómo puedo instalar solo actualizaciones de seguridad desde la línea de comandos?

333

sudo apt-get upgradeinstala todas las actualizaciones, no solo las actualizaciones de seguridad. Sé que puedo usar Update Manager para seleccionar solo actualizaciones de seguridad importantes, pero ¿hay alguna manera de hacerlo desde la línea de comandos?

Michael Crenshaw
fuente
2
No lo creo. dist-upgrade lleva todo el sistema a una nueva versión. Estoy hablando de las actualizaciones diarias, como las que ves en el Administrador de actualizaciones.
Michael Crenshaw
1
Oh, veo lo que estás diciendo ahora. Heh, ejecuto apt-get update tan a menudo, lo escribo sin pensar. ¡Gracias por el aviso!
Michael Crenshaw
77
Desea "apt-get dist-upgrade", no "apt-get upgrade". "dist-upgrade" no es para nuevas versiones (eso es "do-release-upgrade" un comando separado). El uso de "dist-upgrade" significa que manejará las dependencias cambiantes de los nuevos paquetes. Esto puede ser importante
Kees Cook
3
dist-upgrade es la operación normal realizada por la GUI de Update Manager. Para paquetes como el núcleo donde hay un linux-image-genericpaquete, dependiendo de la imagen actual, por ejemplo linux-image-3.x.y-zz-generic(cada versión del cual es un nombre de paquete separado), dist-upgrade (que permite instalar nuevos paquetes para satisfacer dependencias) realizará esta actualización , mientras que la actualización mostrará el paquete del kernel como retenido.
cronitis
3
Sorprendente que no haya buenas apt-getrespuestas basadas para esto, considerando cuán prominentemente aparece en cada servidor
Karthik T

Respuestas:

308

El paquete de actualizaciones desatendidas proporciona la funcionalidad para instalar actualizaciones de seguridad automáticamente.

Puede usar esto, pero en lugar de configurar la parte automática, puede llamarlo manualmente:

sudo unattended-upgrade -d --dry-run
sudo unattended-upgrade -d

Si quieres ejecutarlo en silencio en su lugar:

sudo unattended-upgrade

NOTA: Cuando llama a la actualización desatendida, deja la "s" al final.

Esto supone que el paquete está instalado por defecto, lo que probablemente sea. Si no, solo haz:

sudo apt-get install unattended-upgrades

Ver también /usr/share/doc/unattended-upgrades/README.md.

azulado
fuente
Para deshabilitar la ejecución automática de unattended-upgradeusted probablemente necesite modificar /etc/cron.daily/apt, pero no está seguro de que sea "correcto" hacerlo
Jaime Hablutzel
nota al margen: para el servidor Ubuntu 12.04.5 LTS, unattended-upgradesno está instalado por defecto.
Raptor
13
Como está haciendo esto desde la línea de comandos, úselo -vpara mensajes de información o -dpara mensajes de depuración. De lo contrario, la utilidad será muy silenciosa, en cuyo caso deberá registrar los registros /var/log/unattended-upgrades. También puede usarlo --dry-runpara simular pero no actualizar realmente nada. Para obtener más información y otras opciones, use --helppara obtener el mensaje de ayuda.
ADTC
Aprendí algunas cosas sobre unattended-upgradeshoy. ¡Gracias!
the0ther
"para monitorear cómo va", es solo depurar mensajes no interactivos ¿verdad?
Acuario Power
116

Algunos consejos sobre cómo administrar las actualizaciones

Esto se aplica tanto a Debian como a Ubuntu, pero siguen instrucciones más específicas para Ubuntu.

  • Mostrar solo actualizaciones de seguridad:

    apt-get -s dist-upgrade |grep "^Inst" |grep -i securi 
    

    o

    sudo unattended-upgrade --dry-run -d
    

    o

    /usr/lib/update-notifier/apt-check -p
    
  • Mostrar todos los paquetes actualizables

    apt-get -s dist-upgrade | grep "^Inst"
    
  • Instalar solo actualizaciones de seguridad

    apt-get -s dist-upgrade | grep "^Inst" | 
        grep -i securi | awk -F " " {'print $2'} | 
        xargs apt-get install
    

Notas:

  • A veces, Ubuntu muestra actualizaciones de seguridad como si vinieran del repositorio $ release-updates. Esto es así, me dijeron, porque los desarrolladores de Ubuntu también envían actualizaciones de seguridad al repositorio de $ release-updates para acelerar su disponibilidad.

    Si ese es el caso, puede hacer lo siguiente para mostrar solo las actualizaciones de seguridad:

    sudo sh -c 'grep ^deb /etc/apt/sources.list | 
        grep security > /etc/apt/sources.security.only.list'
    

    y

    apt-get -s dist-upgrade -o Dir::Etc::SourceList=/etc/apt/sources.security.only.list -o Dir::Etc::SourceParts=/dev/null  | 
        grep "^Inst" | awk -F " " {'print $2'}
    
  • Verifique qué servicios deben reiniciarse después de las actualizaciones de paquetes. Averigüe de antemano qué paquetes va a actualizar y programe sus reinicios / reinicios. El problema aquí es que, a menos que reinicie un servicio, todavía puede estar usando una versión anterior de una biblioteca (razón más común) que se ha cargado en la memoria antes de instalar un nuevo paquete que corrige una vulnerabilidad de seguridad o lo que sea.

    checkrestart -v
    

    Sin embargo, tenga en cuenta que checkrestartpuede enumerar procesos que no necesariamente deben reiniciarse. Por ejemplo, el servicio PostgreSQL puede mantener en su memoria referencia a un archivo xlog ya eliminado, lo que no es una razón válida para reiniciar el servicio.

    Por lo tanto, otra forma más confiable de verificar esto utilizando las utilidades estándar es el siguiente script de bash que robé descaradamente de https://locallost.net/?p=233

    Comprueba si los procesos en ejecución en un sistema todavía usan bibliotecas eliminadas en virtud de mantener copias de aquellos en la memoria activa.

    ps xh -o pid |
    while read PROCID; do
           grep 'so.* (deleted)$' /proc/$PROCID/maps 2> /dev/null
           if [ $? -eq 0 ]; then
                   CMDLINE=$(sed -e 's/\x00/ /g' < /proc/$PROCID/cmdline)
                   echo -e "\tPID $PROCID $CMDLINE\n"
           fi
    done
    
YO LIV
fuente
1
Noto solo ahora esta publicación. Es extremadamente preciso. Muchas gracias (+1)
Danduk82
¿De dónde viene 'checkrestart'? No puedo encontrarlo en Ubuntu Trusty. ¿Encontré "needretart" que parece encajar en sus instrucciones?
Ben XO
Se puede encontrar en el paquete debian-goodies: packages.debian.org/wheezy/debian-goodies . También hay necesidad de reiniciar. Puede encontrar ambos en Xenial ejecutando: $ apt-cache search checkrestart
ILIV
Me sale "E: No se pudo abrir el archivo de bloqueo / var / lib / dpkg / lock - open (13: Permiso denegado)" incluso con sudo. ¿Es esto algo específico de una de las actualizaciones o los comandos que ha proporcionado?
Nathan Hornby
Lo más probable es que se trate de una terminación incorrecta / anormal de dpkg que dejó un archivo de bloqueo sin borrar. No sucede normalmente hasta que, por ejemplo, la instalación de un paquete no finaliza correctamente (disco completo, etc.) Probablemente no pueda ejecutar otros comandos apt-get y dpkg, ¿verdad?
ILIV
46

reemplazar /etc/apt/preferencescon lo siguiente:

Package: *
Pin: release a=lucid-security
Pin-Priority: 500

Package: *
Pin: release o=Ubuntu
Pin-Priority: 50

ahora un simple apt-get upgradeactualizará solo todas las actualizaciones de seguridad.

Por qué (y cómo) funciona: el archivo de preferencias fijará todos los paquetes de la distribución de Ubuntu a la prioridad 50, lo que los hará menos deseables que los paquetes ya instalados. Los archivos que se originan en el repositorio de seguridad tienen la prioridad predeterminada (500), por lo que se consideran para la instalación. Esto significa que solo los paquetes que se consideran más deseables que los instalados actualmente son actualizaciones de seguridad. Más información sobre la fijación en la página de manual de apt_preferences .

Puede promover temporalmente una cierta distribución de actualizaciones con la --target-releaseopción que funciona apt-gety aptitude(al menos) que le permitirá fijar ciertas versiones para que sean elegibles para la actualización.

Si desea usar esto solo para scripts y no hacerlo predeterminado para el sistema, puede colocar las reglas en otra ubicación y usar esto en su lugar:

apt-get -o Dir::Etc::Preferences=/path/to/preferences_file upgrade

Esto hará que apt busque el archivo de preferencias desde una ubicación no predeterminada.

El archivo de preferencias dado como ejemplo no se aplica a los repositorios de terceros, si desea anclarlos también puede usarlos apt-cache policypara determinar fácilmente las claves necesarias para anclar.

Ressu
fuente
Gracias por tomarse el tiempo para una respuesta completa. Yo creo que entiendo cómo funciona. Pero cuando creo el archivo / etc / apt / preferencias y ejecuto apt-get upgrade, quiere actualizar todos los paquetes, no solo las actualizaciones de seguridad. La actualización de la lista antes y después es exactamente la misma, excepto que con / etc / apt / preferencias no quiere actualizar Leafpad, que construí desde la fuente e instalé "a mano" con dpkg. Es muy extraño para mí, pero puede significar algo para ti.
Michael Crenshaw
1
Puede ver lo que está sucediendo con el comando de política apt-cache. Elija uno de los paquetes que no recibe una solución de seguridad y ejecútelo apt-cache policy packagename. Esto enumerará las prioridades para varias versiones. Debería ver varias líneas y diferentes prioridades. Si no hay líneas con la prioridad 50, la fijación no afecta a los paquetes en cuestión por alguna razón.
Ressu
1
Había seguido esta respuesta en el pasado. Hoy descubrí que debido a esta respuesta, 68 paquetes de actualización de seguridad NO estaban instalados en mi servidor y no aparecían como candidatos potenciales para la instalación. ¡Esta NO ES UNA BUENA RESPUESTA!
Sombra
12

Lo siguiente se confirma en Ubuntu 14.04 LTS.

Usa el unattended-upgradepaquete.

Mira el archivo /etc/apt/apt.conf.d/50unattended-upgrades. Debe haber una sección en la parte superior que sea:

// Automatically upgrade packages from these (origin:archive) pairs
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
//  "${distro_id}:${distro_codename}-updates";
//  "${distro_id}:${distro_codename}-proposed";
//  "${distro_id}:${distro_codename}-backports";
};

Observe cómo se ha configurado para permitir solo actualizaciones desatendidas para paquetes de seguridad, de forma predeterminada.

Modificar el archivo /etc/apt/apt.conf.d/10periodicsimilar a:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

Esto ejecutará actualizaciones de seguridad desatendidas automáticas, una vez al día.

Ahora, para ejecutar de forma manual: sudo unattended-upgrade.

Para probar como un funcionamiento en seco, sin hacer nada: sudo unattended-upgrade --dry-run.

Fuente: https://help.ubuntu.com/14.04/serverguide/automatic-updates.html

vcardillo
fuente
¿Hay alguna manera de hacer esto un horario mensual?
mike.b93 01 de
1
@ mike.b93, creo que la configuración APT::Periodic::Unattended-Upgrade "30";haría esto, cada 30 días.
vcardillo
5

Aunque es bastante feo, puede deshabilitar todos los repositorios aparte del repositorio de seguridad y luego hacer:

sudo apt-get update && sudo apt-get upgrade

No lo he probado, pero en teoría solo encontraría actualizaciones en el repositorio de seguridad y las aplicaría ...

Stephen RC
fuente
Sí, esa es una posibilidad. Lo miraré. No soy bueno en BASH, pero puedo intentar hacer un script para hacerlo.
Michael Crenshaw
OK, deshabilité todos los repositorios de seguridad de Ubuntu y ejecuté un sudo apt-get update && sudo apt-get upgrade(cancelando antes de que se realizaran las actualizaciones). Luego volví a habilitar todos mis repositorios, ejecuté sudo apt-get updateey abrí Update Manager. Los paquetes marcados como actualizaciones de seguridad no fueron exactamente lo que apt-get upgradeencontraron, pero estaban muy cerca, lo suficientemente cerca para mí. Todavía deseo saber exactamente cómo lo hace Update Manager y cómo hacer lo mismo desde la línea de comandos, pero esto servirá. ¡Gracias!
Michael Crenshaw
3
  • apt-get update: solo lea las entradas en el repositorio, de acuerdo con la lista existente. Necesario para verificar qué hay de nuevo.
  • apt-get upgrade: todas las actualizaciones para paquetes instalados sin módulos del núcleo. Sin actualización de lanzamiento.
  • apt-get dist-upgrade: todas las actualizaciones para paquetes instalados también con módulos de kernel. Sin actualización de lanzamiento.
  • apt-getcon parámetro -s: solo prueba, no se realizaron cambios.
fusor
fuente
0

En Debians, uso este comando para hacer solo actualizaciones de seguridad:

apt-get install -y --only-upgrade $( apt-get --just-print upgrade | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq )
pulsación de tecla
fuente
0

No puedo encontrar una opción en apt-get o aptitude, sin embargo, alguien tenía la misma pregunta sobre SuperUser. La única respuesta es:

Check and adjust /etc/apt/apt.conf.d/50unattended-upgrade. 
Did you replace 'karmic' with the code name of your Ubuntu?

Sin embargo, no hubo respuesta sobre si eso funcionó.

Ross
fuente
2
Parece que el método descrito en esa página wiki depende de establecer el argumento --target-release de aptitude en <release> -security. Al igual que el OP de esa pregunta, ese método instala todas las actualizaciones, no solo las actualizaciones de seguridad. Al leer las páginas de manual de apt-get y aptitude, no creo que el argumento --target-release esté destinado a limitar las actualizaciones solo a la seguridad, aunque no estoy seguro de para qué sirve .
Michael Crenshaw
0

Aquí hay un script que logra esto de diferentes maneras:

#!/usr/bin/env bash
set -e

# List upgradable packages
apt-get update
apt list --upgradable 2>/dev/null
# List security upgrades
test "$(apt-get upgrade -s -y)" && (apt-get upgrade -s -y)
# List upgradable apt packages then upgrade
apt-get update && apt-get upgrade -y  -V | grep '=>' | awk '{print$1}' && test "$(apt-get upgrade -y)"
Seth Bergman
fuente