Voglio che il mio script di report eseguito da cron mi avvisi nel caso in cui ci siano aggiornamenti per i miei pacchetti. È un modo per farmi apt-get
fornirmi lelenco degli aggiornamenti disponibili ma non fare altro?
Risposta
apt
Per le versioni moderne di apt
cè un interruttore specifico per questo:
apt list --upgradable
apt-get
Per il vecchio comando apt-get
, il mostra un elenco di pacchetti disponibili per laggiornamento:
# apt-get -u upgrade --assume-no
Dal apt-get
pagina man :
-u
–show- aggiornato Mostra i pacchetti aggiornati; stampa un elenco di tutti i pacchetti che devono essere aggiornati. Elemento di configurazione: APT :: Get :: Show-Upgraded.
–assume-no “no” automatico a tutti i prompt. & lt == Per impedire lavvio dellinstallazione di
Commenti
Risposta
apt-get --just-print upgrade
Non si legge così facilmente , di seguito è riportato un perl one liner per analizzare loutput 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 come:
PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9
Si spera che possa aiutare qualcun altro,
Commenti
- j per ridere: apt-get -s upgrade | awk -F ‘ [] [()] + ‘ ‘ / ^ Inst / {printf ” Prog:% s \ tcur:% s \ tavail:% s \ n “, $ 2, $ 3, $ 4} ‘
- Potrebbe anche essere molto più bello se utilizzi
column
in 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
- @AntonioK Sembra fantastico!
- ‘ temo che questo codice Perl possa violare la mia macchina .. .;)
- @AntonioK Come ordinate alfabeticamente i nomi dei programmi?
Risposta
Unaltra opzione, ispirata da enzotib:
aptitude search "~U" | wc -l
Questo comando userà aptitude per produrre i nuovi pacchetti e poi wc contare solo le linee.
In una nota a margine, ho scoperto che la soluzione di enzotib senza le virgolette singole attorno a ~U
non funzionava per me. (Wheezy, ZSH, aptitude 0.6.8.2)
Aggiornamento:
Con il nuovo apt puoi fare:
apt list --upgradeable
Commenti
- Grazie per questo, il comando apt list era esattamente quello che volevo.
- Bello con questa soluzione è che non hai bisogno di sudo / root.
Risposta
La più semplice è:
apt list --upgradeable
Commenti
- non funziona su mint.
- ‘ è un peccato che non ‘ t restituisce codici di uscita diversi a seconda che siano disponibili o meno aggiornamenti. Sarebbe stato bello poterlo utilizzare in uno script.
Risposta
Puoi eseguire
aptitude -F%p --disable-columns search ~U
o non documentato
/usr/lib/update-notifier/apt-check -p; echo
Un altro metodo che utilizza un apt-get
simulazione:
apt-get -s dist-upgrade | awk "/^Inst/ { print $2 }"
Commenti
- Questo comando aptitude ha funzionato alla grande per me e ha funzionato non richiede root
- apt-get -s dist-upgrade funziona bene e ha lo stesso output quando lo installi attraverso quellimbarazzo
- grazie! questo è uscito da un po di inferno di dipendenza. stava cercando di
dist-upgrade
ma non perdeva alcuni pacchetti, quindi era necessario utilizzareaptitude
.aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
ha funzionato!
Risposta
Dai unocchiata al pacchetto “apticron”:
apticron – Semplice strumento per inviare e-mail sugli aggiornamenti dei pacchetti in sospeso
Apticron è un semplice script che invia quotidianamente e-mail sugli aggiornamenti dei pacchetti in sospeso come gli aggiornamenti di sicurezza, gestendo correttamente i pacchetti in attesa di dselect e aptitude.
https://packages.debian.org/buster/apticron
Commenti
- Il tuo link è interrotto …
Risposta
apt-get update && apt-get -s upgrade
elencherà gli aggiornamenti disponibili senza effettivamente installarli.
Il primo comando aggiorna i file di indice del pacchetto prima dellaggiornamento simulato (quindi -s) fatto. “-s” eseguirà un aggiornamento simulato mostrando i pacchetti che verrebbero installati ma in realtà non installerà nulla.
Al contrario “-u” invece di “-s” verrebbe effettivamente installato dopo la conferma.
Commenti
- Lopzione di simulazione può essere attivata con uno qualsiasi dei
-s, --simulate, --just-print, --dry-run, --recon, --no-act
, ricognizione e prova a secco sono i miei preferiti personali.
Risposta
Avevo bisogno di informazioni sulla versione completa sui possibili aggiornamenti, quindi ho usato una modifica di jasonwryan “La risposta:
apt-get -V -u upgrade
È un output semplice e con un formato IMO ragionevole.
Risposta
Filtra loutput di
apt-get update && apt-get -s -V -u upgrade
per avere solo le informazioni preferite nel tuo registro.
Molto probabilmente, avrai bisogno della bella parte dopo la riga
…
Verranno aggiornati i seguenti pacchetti:
…
con pochi spazi allinizio.
Commenti
- Ciao e benvenuto nel sito. Allo stato attuale, la tua risposta è fondamentalmente un rimaneggiamento di quelli esistenti e quindi non aggiunge nulla di nuovo. Potresti migliorarlo, ad esempio, spiegando come filtrare loutput, aggiungendo una spiegazione di cosa fanno i vari interruttori ecc.
Risposta
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "
è il più semplice per le email di cron; non cè iterazione utente e se non ci sono aggiornamenti non cè output.
Risposta
Lancia un altro on-liner, 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;
Loutput è simile a questo (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;
Risultato:
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)
Commenti
- Lunica riga è fantastica, tranne per il fatto che ‘ non restituisce la descrizione di alcuni pacchetti.
Risposta
apt-check
è probabilmente il metodo di scripting più efficiente.
/usr/lib/update-notifier/apt-check 2>&1 | cut -d ";" -f 1
Una piccola modifica mostra solo gli aggiornamenti di sicurezza.
/usr/lib/update-notifier/apt-check 2>&1 | cut -d ";" -f 2
Risposta
Dopo aver scritto un avviso alla risposta di @jasonwryan, desidero fornire la mia soluzione:
apt-get dist-upgrade --assume-no
Sfortunatamente, questo non funziona con Debian wheezy e ho dovuto controllare alcuni contenitori lxc che non sono ancora aggiornati. Questo modulo funzionerà sempre:
apt-get dist-upgrade </dev/null
Infine, volevo anche riformattare loutput. Ho scelto di cambiare di nuovo la chiamata (utilizzando --dry-run
ma ignorando tutto loutput aggiuntivo) perché mi sembra 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} "
Restituisce:
The following packages have been kept back: iproute The following packages will be upgraded: unzip
Risposta
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 sono disponibili aggiornamenti e nessuno se non cè “t. In questo modo puoi semplicemente accoppiarlo con una soluzione di monitoraggio.
Risposta
Come un variante uso la seguente:
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 dallutente.
È comunque necessario chiamare apt-get update
con accesso privilegiato.
Commenti
- loutput mostra solo il nome del pacchetto (prima colonna), la seconda colonna mostra sempre = ” e la terza colonna è sempre vuota. ‘ m su Mint.
Rispondi
Lì ” è lo strumento apt-show-versions
. Per mostrare gli aggiornamenti disponibili, esegui:
apt-show-versions -u
-u
è unopzione predefinita diapt-get