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
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ändaaptitude
.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
-u
är ett standardalternativ förapt-get