Come posso installare solo gli aggiornamenti di sicurezza dalla riga di comando?


333

sudo apt-get upgradeinstalla tutti gli aggiornamenti, non solo gli aggiornamenti di sicurezza. So che posso utilizzare Update Manager per selezionare solo importanti aggiornamenti di sicurezza, ma c'è un modo per farlo dalla riga di comando?


2
Io non la penso così. dist-upgrade porta l'intero sistema a una nuova versione. Sto parlando di aggiornamenti quotidiani, come quelli che vedi in Update Manager.
Michael Crenshaw,

1
Oh, capisco cosa stai dicendo ora. Heh, corro apt-get update così spesso, lo scrivo senza pensarci. Grazie per il testa a testa!
Michael Crenshaw,

7
Volete "apt-get dist-upgrade", non "apt-get upgrade". "dist-upgrade" non è per le nuove versioni (questo è "do-release-upgrade" un comando separato). L'uso di "dist-upgrade" significa che gestirà la modifica delle dipendenze dei nuovi pacchetti. Questo può essere importante
Kees Cook,

3
dist-upgrade è la normale operazione eseguita dalla GUI di Update Manager. Per pacchetti come il kernel in cui è presente un linux-image-genericpacchetto, a seconda dell'immagine corrente, ad es. linux-image-3.x.y-zz-generic(Ogni versione del quale è un nome pacchetto separato), dist-upgrade (che consente l'installazione di nuovi pacchetti per soddisfare le dipendenze) eseguirà questo aggiornamento , mentre l'aggiornamento mostrerà il pacchetto del kernel come trattenuto.
cronite,

3
Sorprendente che non ci siano buone apt-getrisposte basate su questo, considerando l'importanza che è elencata su ciascun server
Karthik T

Risposte:


308

Il pacchetto di aggiornamenti automatici fornisce funzionalità per l'installazione automatica degli aggiornamenti di sicurezza.

Puoi usarlo, ma invece di configurare la parte automatica puoi chiamarla manualmente:

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

Se invece vuoi eseguirlo tranquillamente:

sudo unattended-upgrade

NOTA: quando si chiama aggiornamento automatico, si lascia la "s" alla fine.

Ciò presuppone che il pacchetto sia installato per impostazione predefinita, cosa che probabilmente è. In caso contrario, fai semplicemente:

sudo apt-get install unattended-upgrades

Vedi anche /usr/share/doc/unattended-upgrades/README.md.


Per disabilitare l'esecuzione automatica di unattended-upgradete probabilmente dovrai modificare /etc/cron.daily/apt, ma non sei sicuro che sia "corretto" farlo
Jaime Hablutzel,

nota a margine: per il server Ubuntu 12.04.5 LTS, unattended-upgradesnon è installato di default.
Raptor,

13
Dal momento che lo stai facendo dalla riga di comando, usa -vper i messaggi informativi o -dper i messaggi di debug. Altrimenti l'utilità sarà molto silenziosa, nel qual caso dovrai controllare i log in /var/log/unattended-upgrades. Puoi anche usare --dry-runper simulare ma non aggiornare nulla. Per ulteriori informazioni e altre opzioni, utilizzare --helpper ottenere il messaggio di aiuto.
ADTC

ho imparato alcune cose su unattended-upgradesoggi. Grazie!
altro

"per monitorare come va", è solo il debug di messaggi non interattivi giusto?
Aquarius Power

116

Alcuni consigli su come gestire gli aggiornamenti

Questo vale sia per Debian che per Ubuntu, ma seguono istruzioni più specifiche per Ubuntu.

  • Mostra solo gli aggiornamenti di sicurezza:

    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
    
  • Mostra tutti i pacchetti aggiornabili

    apt-get -s dist-upgrade | grep "^Inst"
    
  • Installa solo gli aggiornamenti di sicurezza

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

Appunti:

  • A volte Ubuntu mostra gli aggiornamenti di sicurezza come se provenissero dal repository $ release-updates. È così, mi viene detto, perché gli sviluppatori Ubuntu inviano gli aggiornamenti di sicurezza al repository $ release-updates anche per accelerare la loro disponibilità.

    In tal caso, è possibile eseguire le seguenti operazioni per mostrare solo gli aggiornamenti di sicurezza:

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

    e

    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'}
    
  • Verifica quali servizi devono essere riavviati dopo gli aggiornamenti del pacchetto. Scopri quali pacchetti aggiornerai in anticipo e pianifica i tuoi riavvii / riavvii. Il problema qui è che, a meno che non si riavvii un servizio, è possibile che stia ancora utilizzando una versione precedente di una libreria (motivo più comune) che è stato caricato in memoria prima di installare un nuovo pacchetto che risolve una vulnerabilità di sicurezza o altro.

    checkrestart -v
    

    Tuttavia, tenere presente che checkrestartpotrebbero essere elencati i processi che non devono essere necessariamente riavviati. Ad esempio, il servizio PostgreSQL potrebbe conservare nella memoria il riferimento a un file xlog già eliminato, che non è un motivo valido per riavviare il servizio.

    Pertanto, un altro modo più affidabile per verificarlo utilizzando utils standard è il seguente piccolo script bash che ho spudoratamente rubato da https://locallost.net/?p=233

    Verifica se i processi in esecuzione su un sistema utilizzano ancora librerie eliminate in virtù del mantenimento di copie di quelle nella memoria attiva.

    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
    

1
Noto solo ora questo post. È estremamente preciso. Grazie mille (+1)
Danduk82,

da dove viene "checkrestart"? Non riesco a trovarlo in Ubuntu Trusty. Ho trovato "needrestart" che sembra adattarsi alle tue istruzioni?
Ben XO,

Può essere trovato nel pacchetto debian-goodies: packages.debian.org/wheezy/debian-goodies . C'è anche bisogno di iniziare. Puoi trovarli entrambi su Xenial eseguendo: $ apt-cache search checkrestart
ILIV

Ottengo "E: Impossibile aprire il file di blocco / var / lib / dpkg / lock - open (13: autorizzazione negata)" anche con sudo. È qualcosa di specifico per uno degli aggiornamenti o dei comandi che hai fornito?
Nathan Hornby,

Molto probabilmente si tratta di una chiusura errata / anormale di dpkg che non ha chiarito un file di blocco. Non succede normalmente fino a quando, ad esempio, l'installazione di un pacchetto non termina correttamente (disco intero, ecc.) Probabilmente non è possibile eseguire altri comandi apt-get e dpkg, vero?
ILIV

46

sostituire /etc/apt/preferencescon il seguente:

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

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

ora un semplice apt-get upgradeaggiornerà solo tutti gli aggiornamenti di sicurezza.

Perché (e come) funziona: il file delle preferenze bloccherà tutti i pacchetti dalla distribuzione Ubuntu alla priorità 50, il che li renderà meno desiderabili dei pacchetti già installati. Ai file che provengono dal repository di sicurezza viene assegnata la priorità predefinita (500), quindi vengono considerati per l'installazione. Ciò significa che solo i pacchetti considerati più desiderabili di quelli attualmente installati sono aggiornamenti di sicurezza. Ulteriori informazioni sull'inserimento nella manpage apt_preferences .

Puoi promuovere temporaneamente una determinata distribuzione per gli aggiornamenti con l' --target-releaseopzione che funziona con apt-gete aptitude(almeno) che ti consentirà di bloccare determinate versioni in modo che siano idonee per l'aggiornamento.

Se si desidera utilizzarlo solo per gli script e non renderlo predefinito per il sistema, è possibile posizionare le regole in un'altra posizione e utilizzare invece questo:

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

Questo farà in modo che apt cerchi il file delle preferenze da una posizione non predefinita.

Il file delle preferenze fornito come esempio non si applica ai repository di terze parti, se si desidera bloccare anche quelli che è possibile utilizzare apt-cache policyper determinare facilmente le chiavi richieste per il pinning.


Grazie per aver dedicato del tempo per una risposta approfondita. Io penso che ho capito come funziona. Ma quando creo il file / etc / apt / preferenze ed eseguo apt-get upgrade, vuole aggiornare tutti i pacchetti, non solo gli aggiornamenti di sicurezza. L'aggiornamento dell'elenco prima e dopo è esattamente lo stesso, tranne che con / etc / apt / preferenze non vuole aggiornare Leafpad, che ho creato dal sorgente e installato "a mano" con dpkg. È molto strano per me, ma può significare qualcosa per te.
Michael Crenshaw,

1
Puoi vedere cosa sta succedendo con il comando della politica di apt-cache. Scegli uno dei pacchetti che non ottengono una correzione di sicurezza ed eseguilo apt-cache policy packagename. Questo elencherà le priorità per varie versioni. Dovresti vedere varie linee e priorità diverse. Se non ci sono righe con la priorità 50, il pinning non influisce sui pacchetti in questione per qualche motivo.
Ressu,

1
Avevo seguito questa risposta in passato. Oggi ho scoperto che a causa di questa risposta, 68 pacchetti di aggiornamento per la sicurezza NON sono stati installati sul mio server e non sono stati presentati come potenziali candidati all'installazione. Questa NON È UNA BUONA RISPOSTA!
Ombra

12

Quanto segue è confermato in Ubuntu 14.04 LTS.

Usa il unattended-upgradepacchetto.

Guarda il file /etc/apt/apt.conf.d/50unattended-upgrades. Dovrebbe esserci una sezione in alto che è:

// 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";
};

Si noti come è stato configurato per consentire solo gli aggiornamenti automatici per i pacchetti di sicurezza, per impostazione predefinita.

Modifica il file in modo /etc/apt/apt.conf.d/10periodicsimile a:

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

Questo eseguirà aggiornamenti automatici della sicurezza automatica, una volta al giorno.

Ora, per eseguire manualmente: sudo unattended-upgrade.

Per eseguire il test come un funzionamento a secco, senza fare nulla: sudo unattended-upgrade --dry-run.

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


C'è un modo per rendere questo un programma mensile?
mike.b93,

1
@ mike.b93, credo che l'impostazione APT::Periodic::Unattended-Upgrade "30";Farebbe questo - ogni 30 giorni.
vcardillo,

5

Sebbene sia piuttosto brutto, è possibile disabilitare tutti i repository oltre al repository di sicurezza e quindi fare:

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

Non l'ho provato, ma in teoria troverebbe solo gli aggiornamenti nel repository di sicurezza e li applicherebbe ...


Sì, questa è una possibilità. Ci penserò. Non sono bravo in BASH, ma potrei provare a creare una sceneggiatura per farlo.
Michael Crenshaw,

OK, ho disabilitato tutti tranne i repository di sicurezza di Ubuntu ed ho eseguito un sudo apt-get update && sudo apt-get upgrade(annullamento prima che fossero effettuati eventuali aggiornamenti). Quindi ho riabilitato tutti i miei repository, eseguito sudo apt-get updateee aperto Update Manager. I pacchetti contrassegnati come aggiornamenti di sicurezza non erano esattamente quelli apt-get upgradetrovati, ma erano molto vicini, abbastanza vicini per me. Vorrei ancora sapere esattamente come fa Update Manager e come fare lo stesso dalla riga di comando, ma lo farà. Grazie!
Michael Crenshaw,

3
  • apt-get update: basta leggere le voci nel repository - secondo l'elenco esistente. Necessario controllare le novità.
  • apt-get upgrade: tutti gli aggiornamenti per i pacchetti installati senza moduli del kernel. Nessun aggiornamento di rilascio.
  • apt-get dist-upgrade: tutti gli aggiornamenti per i pacchetti installati anche con moduli kernel. Nessun aggiornamento di rilascio.
  • apt-getcon parametro -s: solo test, nessuna modifica eseguita.

0

Su Debians uso questo comando per fare solo aggiornamenti di sicurezza:

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

0

Non riesco a trovare un'opzione in apt-get o aptitude, tuttavia qualcuno ha avuto la stessa domanda su SuperUser. L'unica risposta è:

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

Nessuna risposta sul fatto che funzionasse comunque.


2
Sembra che il metodo descritto in quella pagina wiki dipenda dall'impostare l'argomento --target-release su <release> -security. Come il PO di quella domanda, quel metodo installa tutti gli aggiornamenti, non solo gli aggiornamenti di sicurezza. Leggendo le apt-get e pagine man attitudinali, non credo che l'argomento --target-release è anche lo scopo di limitare gli aggiornamenti per la sicurezza solo, anche se non sono sicuro che solo ciò che è per.
Michael Crenshaw,

0

Ecco uno script che raggiunge questo in diversi modi:

#!/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)"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.