Oppgi tilgjengelige oppdateringer, men ikke installer dem

Jeg vil at mitt cron-run rapporteringsskript skal varsle meg i tilfelle det er oppdateringer for pakkene mine. Er det en måte å få apt-get til å gi meg listen over tilgjengelige oppdateringer, men ikke gjøre noe mer?

Svar

apt

For moderne versjoner av apt er det en spesifikk bryter for dette:

apt list --upgradable

apt-get

For den gamle apt-get kommandoen -u -bryteren viser en liste over pakker som er tilgjengelige for oppgradering:

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

Fra apt-get manside :

-u
–show- oppgradert
  Vis oppgraderte pakker; Skriv ut en liste over alle pakker som skal oppgraderes. Konfigurasjonselement: APT :: Get :: Show-Upgraded.
–assume-no   Automatisk «nei» til alle instruksjonene. & lt == For å forhindre at det begynner å installere

Kommentarer

  • Jeg håpet dette kunne gjøres uten rot
  • Hvis du skriver » Y » og trykker Enter, denne kommandoen vil installere oppdateringer. Jeg vil absolutt anbefale å legge til » -s «, ellers er dette svaret misvisende
  • Dette er en veldig feil svar fordi (uten tilleggsvalg) kommandoen venter på inndata, og hvis brukeren skriver inn feil inngang, er pakken installert, som endrer systemet som ikke er det OP ønsker (skjedde nettopp på systemet mitt)
  • Og btw: -u er et standardalternativ for apt-get
  • @ThorSummoner ‘ -s ‘ vil gjøre det du vil & fungerer uten rot

Svar

apt-get --just-print upgrade 

Leses ikke så lett , nedenfor er en perl one liner for å analysere apt-get «s output:

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

Dette skal sende noe sånt som:

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

Forhåpentligvis hjelper det noen andre,

Kommentarer

  • j ust for the latter: apt-get -s upgrade | awk -F ‘ [] [()] + ‘ ‘ / ^ Inst / {printf » Prog:% s \ tcur:% s \ tavail:% s \ n «, $ 2, $ 3, $ 4} ‘
  • Det kan også være mye finere å se, hvis du bruker column slik: 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 Ser bra ut!
  • Jeg ‘ er redd denne Perl-koden vil hacke maskinen min .. .;)
  • @AntonioK Hvordan sorterer du navnene på programmene alfabetisk?

Svar

Et annet alternativ, inspirert av enzotib:

aptitude search "~U" | wc -l

Denne kommandoen vil bruke egenskap til å sende ut de nye pakkene og deretter wc å bare telle linjene.

På en sidenote fant jeg ut at enzotibs løsning uten de eneste sitatene rundt ~U ikke virket for meg. (Wheezy, ZSH, aptitude 0.6.8.2)

Oppdatering:

Med den nye apt kan du gjøre:

apt list --upgradeable

Kommentarer

  • Takk for dette, apt list-kommandoen var akkurat det jeg ønsket.
  • Fint med denne løsningen er at du ikke trenger sudo / root.

Svar

Det enkleste er:

apt list --upgradeable

Kommentarer

  • fungerer ikke på mynte.
  • Det ‘ er synd dette gjør ikke ‘ t returner forskjellige utgangskoder, avhengig av om det er oppgraderinger tilgjengelig eller ikke. Hadde vært fint å kunne bruke dette i et skript.

Svar

Du kan kjøre

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

eller udokumenterte

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

En annen metode som bruker en apt-get simulering:

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

Kommentarer

  • Denne egnethetskommandoen fungerte bra for meg og gjorde ikke krever root
  • apt-get -s dist-upgrade fungerer også bra og har samme utgang når du piper den gjennom den awkeren
  • takk! dette kom ut av ganske mye avhengighetshelvete. prøvde å dist-upgrade men ikke miste noen pakker som trengs for å bruke aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }') gjorde susen!

Svar

Ta en titt på pakken «apticron»:

apticron – Enkel verktøy for å sende om ventende pakkeoppdateringer

Apticron er et enkelt skript som sender daglige e-postmeldinger om ventende pakkeoppdateringer, for eksempel sikkerhetsoppdateringer, og håndterer pakker på riktig måte begge av valg og evne.

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

Kommentarer

  • Linken din er ødelagt …

Svar

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

vil vise tilgjengelige oppdateringer uten å faktisk installere.

Første kommando oppdaterer pakkeindeksfiler før simulert (dermed -s) oppgradering er ferdig. «-s» vil gjøre en simulert oppgradering som viser pakker som vil bli installert, men som ikke vil installere noe.

Tvert imot vil «-u» i stedet for «-s» faktisk installeres etter bekreftelse.

Kommentarer

  • Simuleringsalternativet kan utløses med hvilken som helst av -s, --simulate, --just-print, --dry-run, --recon, --no-act, recon og dry-run er min personlige favoritter.

Svar

Jeg trengte fullversjonsinformasjon om mulige oppgraderinger, så jeg brukte en modifikasjon av jasonwryan «s svar:

apt-get -V -u upgrade 

Det er enkelt og IMO rimelig formatert utdata.

Svar

Bare filtrer utdata fra

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

for å ha bare den foretrukne informasjonen i loggen din.

Mest sannsynlig vil du trenge den vakre delen etter linjen

Følgende pakker blir oppgradert:

som har få mellomrom i begynnelsen.

Kommentarer

  • Hei og velkommen til siden. Slik det ser ut, er svaret ditt i utgangspunktet en repetisjon av eksisterende, og det legger ikke til noe nytt. Du kan forbedre det ved for eksempel å forklare hvordan du filtrerer utdataene, legge til en forklaring på hva de forskjellige bryterne gjør osv.

Svar

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

er det enkleste for cron-e-post; det er ingen bruker-iterasjon, og hvis det ikke er noen oppdateringer, er det ingen utdata.

Svar

Jet en annen on-liner, inspirert av dette svaret :

 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;  

Utgangen ser slik ut (farget):

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 

Hvis du ikke vil ha en kort beskrivelse, bruk denne:

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

Utgang:

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) 

Kommentarer

  • Den ene linjeren er fantastisk, bortsett fra at den ikke ‘ ikke gir beskrivelsen av noen pakker.

Svar

apt-check er sannsynligvis den mest effektive skriptmetoden.

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

En veldig liten modifikasjon viser bare sikkerhetsoppdateringene.

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

Svar

Etter å ha skrevet advarsel til @jasonwryans svar, vil jeg gi min egen løsning:

apt-get dist-upgrade --assume-no 

Dessverre fungerer denne ikke med debian wheezy, og jeg måtte sjekke noen lxc-containere som fremdeles ikke er oppgradert. Dette skjemaet vil alltid fungere:

apt-get dist-upgrade </dev/null 

Til slutt ønsket jeg også å formatere produksjonen. Jeg valgte å endre samtalen igjen (ved hjelp av --dry-run men ignorerer all ekstra utgang) fordi det føles tryggere:

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

Returnerer:

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

Svar

Jeg liker å bruke dette:

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

Du får en utdata som denne:

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

hvis det er tilgjengelige oppdateringer , og ingen hvis det ikke er «t. På denne måten kan du bare koble det til en overvåkingsløsning.

Svar

Som en variant bruker jeg følgende:

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

Stikk det inn i et skript som heter apt-updates og du kan da ringe apt-updates for å få en oversikt over alle oppdateringer uavhengig av bruker.

Du trenger fortsatt å ringe apt-get update med privilegert tilgang.

Kommentarer

  • utdata viser bare pakkenavnet (første kolonne), andre kolonne skriver alltid ut = » og tredje kolonne er alltid tom. Jeg ‘ m on Mint.

Svar

Der » er verktøyet apt-show-versions . For å vise tilgjengelige oppdateringer, kjør:

apt-show-versions -u 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *