Risposte:
Per le versioni moderne apt
c'è un interruttore specifico per questo:
apt list --upgradable
Per il vecchio apt-get
comando, l' -u
opzione mostra un elenco di pacchetti disponibili per l'aggiornamento:
# apt-get -u upgrade --assume-no
Dalla apt-get
pagina 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
-u
è un'opzione predefinita diapt-get
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,
column
questo 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
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
Il più semplice è:
apt list --upgradable
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-get
simulazione:
apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
dist-upgrade
non perdere alcuni pacchetti, quindi era necessario usarli aptitude
. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
fatto il trucco!
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.
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.
-s, --simulate, --just-print, --dry-run, --recon, --no-act
preferiti personali: ricognizione e funzionamento a secco.
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.
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)
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.
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-run
ma 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
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
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-updates
e puoi quindi chiamare apt-updates
per ottenere un elenco di tutti gli aggiornamenti indipendentemente dall'utente.
È comunque necessario chiamare apt-get update
con accesso privilegiato.
C'è lo apt-show-versions
strumento. Per mostrare gli aggiornamenti disponibili, esegui:
apt-show-versions -u
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.