Elencare gli aggiornamenti disponibili ma non installarli


209

Voglio che il mio script di reporting cron-run mi avvisi nel caso ci siano aggiornamenti per i miei pacchetti. È un modo per farmi apt-getdare l'elenco degli aggiornamenti disponibili ma non fare altro?

Risposte:


231

adatto

Per le versioni moderne aptc'è un interruttore specifico per questo:

apt list --upgradable

apt-get

Per il vecchio apt-getcomando, l' -uopzione mostra un elenco di pacchetti disponibili per l'aggiornamento:

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

Dalla apt-getpagina man :

-u
--show-upgraded
 Mostra i pacchetti aggiornati; Stampa un elenco di tutti i pacchetti che devono essere aggiornati. Elemento di configurazione: APT :: Get :: Show-Upgrade.
--assume-no  Automatico "no" a tutte le istruzioni. <== Per impedire l'avvio dell'installazione

2
Speravo che questo potesse essere fatto senza root
ThorSummoner,

19
Se si digita "Y" e premere Invio, questo comando sarà installare gli aggiornamenti. Consiglio vivamente di aggiungere "-s", altrimenti questa risposta è fuorviante
Murmel,

5
Questa è una risposta molto sbagliata perché (senza opzioni aggiuntive) il comando attende l'input e se l'utente immette l'input errato, il pacchetto viene installato, il che modifica il sistema che non è quello che l'OP vuole (è appena successo sul mio sistema)
Daniel Alder,

E a proposito: -uè un'opzione predefinita diapt-get
Daniel Alder,

1
@ThorSummoner '-s' farà quello che vuoi e funziona senza root
nevelis

67
apt-get --just-print upgrade

Non si legge così facilmente, di seguito è riportato un perl one liner per analizzare l'output di 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"}'

Questo dovrebbe produrre qualcosa di simile:

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

Spero che possa aiutare qualcun altro,


1
solo per la risata: apt-get -s upgrade | awk -F '[] [()] +' '/ ^ Inst / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
tink

8
Potrebbe anche essere molto più bello, se usato in columnquesto modo: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 Sembra fantastico!
Nick,

1
Temo che questo codice Perl comprometterà la mia macchina ...;)
Chris,

33

Un'altra opzione, ispirata da enzotib:

aptitude search '~U' | wc -l

Questo comando utilizzerà aptitude per generare i nuovi pacchetti e quindi wc per contare solo le righe.

Su un sidenote, ho scoperto che la soluzione di enzotib senza le virgolette singole intorno alla ~ U non ha funzionato per me. (Wheezy, ZSH, attitudine 0.6.8.2)

Aggiornare :

Con il nuovo apt puoi fare ora:

apt list --upgradable

Grazie per questo, il comando list list era esattamente quello che volevo.
dvorak,

Bene con questa soluzione è che non hai bisogno di sudo / root.
Gunni,

25

Il più semplice è:

apt list --upgradable

non funziona alla zecca.
ychaouche,

1
È un peccato che non restituisca codici di uscita diversi a seconda che siano disponibili aggiornamenti o meno. Sarebbe stato bello poterlo usare in uno script.
Dale Anderson,

18

Puoi correre

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

o il non documentato

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

Un altro metodo che utilizza una apt-getsimulazione:

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

1
Questo comando aptitude ha funzionato benissimo per me e non ha richiesto il root
JamesCW

apt-get -s dist-upgrade funziona anche bene e ha lo stesso output quando lo installi attraverso quel pazzo
ychaouche

grazie! questo è uscito da un bel po 'di inferno di dipendenza. stava cercando di dist-upgradenon perdere alcuni pacchetti, quindi era necessario usarli aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')fatto il trucco!
Jayen,

11

Dai un'occhiata al pacchetto "apticron":

apticron - Semplice strumento per inviare e-mail sugli aggiornamenti dei pacchetti in sospeso

Apticron è un semplice script che invia e-mail giornaliere sugli aggiornamenti dei pacchetti in sospeso come gli aggiornamenti di sicurezza, gestendo correttamente i pacchetti in attesa sia di dselect che di aptitude.

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


Il tuo collegamento è interrotto ...
Alexis Wilke,

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

elencherà gli aggiornamenti disponibili senza installarli effettivamente.

Il primo comando aggiorna i file di indice del pacchetto prima di eseguire l'aggiornamento simulato (quindi -s). "-s" eseguirà un aggiornamento simulato mostrando i pacchetti che verrebbero installati ma in realtà non installeranno nulla.

Al contrario, "-u" anziché "-s" verrebbe effettivamente installato dopo la conferma.


2
L'opzione di simulazione può essere attivata con qualsiasi dei seguenti -s, --simulate, --just-print, --dry-run, --recon, --no-actpreferiti personali: ricognizione e funzionamento a secco.
ThorSummoner,

9

Avevo bisogno di informazioni sulla versione completa su possibili aggiornamenti, quindi ho usato una modifica della risposta di Jasonwryan:

apt-get -V -u upgrade

È un output semplice e IMO formattato in modo ragionevole.


3

Basta filtrare l'output di

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

per avere solo le informazioni preferite nel tuo registro.

Molto probabilmente, avrai bisogno della parte bella dopo la linea

...

Verranno aggiornati i seguenti pacchetti:

...

che ha pochi spazi all'inizio.


Ciao e benvenuto nel sito. Allo stato attuale, la tua risposta è fondamentalmente una revisione di quelli esistenti e quindi non aggiunge nulla di nuovo. Potresti migliorarlo, ad esempio, spiegando come filtrare l'uscita, aggiungendo una spiegazione di cosa fanno i vari switch ecc.
terdon

2

Jet un altro in linea, ispirato da questa risposta :

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;

L'output è simile al seguente (colorato):

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

Se non vuoi la breve descrizione, usa questa:

{ 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;

Produzione:

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)

L'unico liner è fantastico, tranne per il fatto che non fornisce la descrizione di alcuni pacchetti.
ychaouche,

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

è il più semplice per le e-mail cron; non c'è iterazione utente e se non ci sono aggiornamenti non c'è output.


1

Dopo aver scritto un avviso alla risposta di @ jasonwryan, voglio fornire la mia soluzione:

apt-get dist-upgrade --assume-no

Sfortunatamente, questo non funziona con debian wheezy e ho dovuto controllare alcuni container lxc che non sono ancora stati aggiornati. Questo modulo funzionerà sempre:

apt-get dist-upgrade </dev/null

Infine, volevo anche riformattare l'output. Ho scelto di modificare nuovamente la chiamata (utilizzando --dry-runma ignorando tutto l'output aggiuntivo) perché è più sicuro:

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}
'

Ritorna:

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

1

apt-check è probabilmente il metodo di scripting più efficiente.

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

Una modifica molto piccola mostra solo gli aggiornamenti di sicurezza.

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

0

Come variante, utilizzo quanto segue:

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)
     }'

Inseriscilo in uno script chiamato apt-updatese puoi quindi chiamare apt-updatesper ottenere un elenco di tutti gli aggiornamenti indipendentemente dall'utente.

È comunque necessario chiamare apt-get updatecon accesso privilegiato.


l'output mostra solo il nome del pacchetto (prima colonna), la seconda colonna stampa sempre "=" e la terza colonna è sempre vuota. Sono sulla menta.
ychaouche,


0

Mi piace usare questo:

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

Ottieni un output come questo:

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

se ci sono aggiornamenti disponibili e nessuno se non lo è. In questo modo puoi semplicemente associarlo a una soluzione di monitoraggio.

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.