Lista tillgängliga uppdateringar men installera inte dem

Jag vill att mitt cron-run rapporteringsskript meddelar mig om det finns uppdateringar för mina paket. Är det ett sätt att få apt-get att ge mig listan över tillgängliga uppdateringar men inte göra något mer?

Svar

apt

För moderna versioner av apt finns en specifik switch för detta:

apt list --upgradable

apt-get

För det gamla apt-get kommandot -u -omkopplaren visar en lista över paket som är tillgängliga för uppgradering:

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

Från apt-get mansida :

-u
–show- uppgraderad
  Visa uppgraderade paket; Skriv ut en lista över alla paket som ska uppgraderas. Konfigurationsalternativ: APT :: Get :: Show-Upgraded.
–assume-no   Automatisk ”nej” till alla uppmaningar. & lt == För att förhindra att den börjar installera

Kommentarer

  • Jag hoppades att detta kunde göras utan root
  • Om du skriver ” Y ” och trycker på Enter, det här kommandot installerar uppdateringar. Jag skulle definitivt rekommendera att lägga till ” -s ”, annars är svaret vilseledande
  • Detta är en mycket fel svar eftersom (utan ytterligare alternativ) kommandot väntar på inmatning och om användaren matar in fel inmatning är paketet installerat, vilket ändrar systemet vilket inte är vad OP vill (har precis hänt på mitt system)
  • Och btw: -u är ett standardalternativ för apt-get
  • @ThorSummoner ’ -s ’ gör vad du vill & fungerar utan root

Svar

apt-get --just-print upgrade 

Läses inte så lätt , nedan är en perl-liner för att analysera 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"}" 

Detta ska mata ut något som:

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

Förhoppningsvis hjälper det någon annan,

Kommentarer

  • j lust för skratt: apt-get -s uppgradering | awk -F ’ [] [()] + ’ ’ / ^ Inst / {printf ” Prog:% s \ tcur:% s \ tavail:% s \ n ”, $ 2, $ 3, $ 4} ’
  • Det kan också vara mycket trevligare, om du använder column så här: 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!
  • Jag ’ är rädd att den här Perl-koden kommer att hacka min maskin .. .;)
  • @AntonioK Hur sorterar du programmens namn alfabetiskt?

Svar

Ett annat alternativ, inspirerat av enzotib:

aptitude search "~U" | wc -l

Detta kommando använder aptitude för att mata ut de nya paketen och sedan wc att bara räkna raderna.

På en sidotot fann jag att enzotibs lösning utan de enskilda citaten runt ~U inte fungerade för mig. (Wheezy, ZSH, aptitude 0.6.8.2)

Uppdatering:

Med den nya apt kan du göra:

apt list --upgradeable

Kommentarer

  • Tack för detta, apt list-kommandot var precis vad jag ville.
  • Trevligt med den här lösningen är att du inte behöver sudo / root.

Svar

Det enklaste är:

apt list --upgradeable

Kommentarer

  • fungerar inte på mynta.
  • Det ’ en skam att detta inte ’ t returnera olika utgångskoder beroende på om det finns uppgraderingar tillgängliga eller inte. Skulle ha varit trevligt att kunna använda detta i ett skript.

Svar

Du kan köra

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

eller odokumenterade

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

En annan metod som använder en apt-get simulering:

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

Kommentarer

  • Detta aptitude-kommando fungerade bra för mig och gjorde kräver inte root
  • apt-get -s dist-upgrade fungerar också bra och har samma utdata när du rör det igenom det awker
  • tack! det här kom ur en hel del beroendeberoende. försökte dist-upgrade men inte förlora några paket som behövs för att använda aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }') gjorde tricket!

Svar

Ta en titt på paketet ”apticron”:

apticron – Enkelt verktyg för att skicka e-post om väntande paketuppdateringar

Apticron är ett enkelt skript som skickar dagliga e-postmeddelanden om väntande paketuppdateringar som säkerhetsuppdateringar, som hanterar paket på rätt sätt båda genom val och skicklighet.

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

Kommentarer

  • Din länk är trasig …

Svar

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

listar tillgängliga uppdateringar utan att egentligen installeras.

Första kommandot uppdaterar paketindexfiler innan simulerad (alltså -s) uppgradering är Gjort. ”-s” gör en simulerad uppgradering som visar paket som skulle installeras men som faktiskt inte installerar någonting.

Tvärtom skulle ”-u” istället för ”-s” faktiskt installeras efter bekräftelse.

Kommentarer

  • Simuleringsalternativet kan utlösas med någon av -s, --simulate, --just-print, --dry-run, --recon, --no-act, recon och dry-run är min personliga favoriter.

Svar

Jag behövde fullständig versioninformation om möjliga uppgraderingar, så jag använde en modifiering av jasonwryan ”s svar:

apt-get -V -u upgrade 

Det är enkelt och IMO-format med rimligt format.

Svar

Filtrera bara utdata från

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

för att bara ha den föredragna informationen i din logg.

Troligtvis behöver du den vackra delen efter raden

Följande paket uppgraderas:

som har få mellanslag i början.

Kommentarer

  • Hej och välkommen till webbplatsen. Som det ser ut är ditt svar i grunden en upprepning av befintliga och det tillför inte något nytt. Du kan förbättra det genom att till exempel förklara hur du filtrerar utdata, lägga till en förklaring av vad de olika omkopplarna gör osv.

Svar

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

är det enklaste för cron-e-postmeddelanden; det finns ingen användar iteration, och om det inte finns några uppdateringar finns det ingen utdata.

Svar

Jet en annan on-liner, inspirerad av detta svar :

 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;  

Utgången ser ut så här (färgad):

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 

Om du inte vill ha en kort beskrivning, använd den här:

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

Output:

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 ena linern är fantastisk, förutom att den inte ’ inte matar ut beskrivningen av vissa paket.

Svar

apt-check är förmodligen den mest effektiva skriptmetoden.

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

En mycket liten modifiering visar bara säkerhetsuppdateringarna.

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

Svar

Efter att ha skrivit varning till @jasonwryans svar vill jag ge min egen lösning:

apt-get dist-upgrade --assume-no 

Tyvärr fungerar den här inte med debian wheezy och jag var tvungen att kontrollera några lxc-behållare som fortfarande inte är uppgraderade. Det här formuläret fungerar alltid:

apt-get dist-upgrade </dev/null 

Slutligen ville jag också formatera om produktionen. Jag valde att ändra samtalet igen (med --dry-run men ignorerar alla ytterligare utdata) eftersom det känns säkrare:

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

Returnerar:

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

Svar

Jag vill använda det här:

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

Du får en utdata som den här:

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

om det finns tillgängliga uppdateringar , och ingen om det inte finns ”t. På så sätt kan du helt enkelt koppla ihop det med en övervakningslösning.

Svar

Som en variant använder jag följande:

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

Stick in det i ett skript som heter apt-updates och du kan sedan ringa apt-updates för att få en lista över alla uppdateringar oavsett användare.

Du behöver fortfarande ringa apt-get update med privilegierad åtkomst.

Kommentarer

  • utdata visar bara paketnamnet (första kolumnen), andra kolumnen skriver alltid ut = ” och tredje kolumnen är alltid tom. Jag ’ m på Mint.

Svar

Där ” är verktyget apt-show-versions . För att visa tillgängliga uppdateringar kör:

apt-show-versions -u 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *