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
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 å brukeaptitude
.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
-u
er et standardalternativ forapt-get