Mevcut güncellemeleri listele, ancak yüklemeyin


209

Paketlerimde güncelleme olması durumunda, cron çalıştırmalı raporlama komut dosyamın beni bilgilendirmesini istiyorum. apt-getBana mevcut güncellemelerin bir listesini vermenin bir yolu var mı, başka bir şey yapmıyor musunuz?

Yanıtlar:


231

uygun

Modern versiyonları aptiçin bunun için özel bir anahtar vardır:

apt list --upgradable

apt-get

Eski apt-getkomut için, -uanahtar yükseltme için mevcut olan paketlerin bir listesini gösterir:

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

Gönderen apt-getadam sayfası :

-u
--show-yükseltilmiş
 Yükseltilmiş paketleri göster; Yükseltilecek tüm paketlerin bir listesini yazdırın. Yapılandırma Öğesi: APT :: Get :: Show-Upgraded.
--assume-hayır  tüm sorular Otomatik "hayır". <== Yüklemeye başlamasını önlemek için

2
Bunun kök olmadan yapılabileceğini umuyordum
ThorSummoner

19
Eğer "Y" yazıp Enter'a basın, bu komut olacak güncellemeleri yükleyin. Kesinlikle "-s" eklemeyi tavsiye ederim, aksi takdirde bu cevap yanıltıcıdır
Murmel

5
Bu çok yanlış bir cevaptır, çünkü (ek seçenek olmadan) komut giriş için bekler ve kullanıcı yanlış giriş yaparsa, paket yüklenir, bu da OP'nin istediği olmayan sistemi değiştirir (sistemimde oldu)
Daniel Alder

Ve btw: -uvarsayılan bir seçenekapt-get
Daniel Alder

1
@ThorSummoner '-s' istediğinizi yapar ve kök olmadan çalışır
nevelis

67
apt-get --just-print upgrade

Kolayca okunmuyor, apt-get çıktısını çözümlemek için aşağıda bir perl bir liner olduğunu:

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

Bu şöyle bir şey çıkmalı:

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

Umarım başka birine yardım eder.


1
sadece gülmek için: apt-get -s upgrade | awk -F '[] [()] +'' '/ ^ Inst / {Printf "Prog% s \ Tkür% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
tink

8
Bu şekilde kullanırsanız, çok daha hoş görünümlü olabilir column: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

1
@AntonioK Harika görünüyor!
nick

1
Korkarım bu Perl kodu makinemi
Chris

33

Enzotib'den ilham alan başka bir seçenek:

aptitude search '~U' | wc -l

Bu komut, yeni paketleri çıktılamak için yetenek kullanır ve ardından sadece satırları saymak için wc kullanır.

Bir sınırda, ~ U'nun etrafındaki tek tırnak olmadan enzotibin çözümünün benim için işe yaramadığını öğrendim. (Wheezy, ZSH, yetenek 0.6.8.2)

Güncelleme :

Yeni apt ile şimdi yapabilirsiniz:

apt list --upgradable

Bunun için teşekkürler, apt list komutu tam olarak istediğim şeydi.
dvorak

Bu çözüm ile güzel, sudo / root'a ihtiyacınız yok.
Gunni,

25

En kolayı şudur:

apt list --upgradable

nane üzerinde çalışmaz.
ychaouche 09:17

1
Utanç verici bir durum olup olmadığına bağlı olarak farklı çıkış kodları döndürmemek utanç verici. Bunu bir komut dosyasında kullanmak güzel olurdu.
Dale Anderson,

18

Koşabilirsin

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

veya belgesiz

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

apt-getSimülasyon kullanan başka bir yöntem :

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

1
Bu yetenek emri benim için çok işe yaradı ve kök gerektirmedi
JamesCW

apt-get -s dist-upgrade da çok iyi çalışıyor ve onu daha da uyandırırken aynı çıktıya sahip
ychaouche

teşekkür ederim! Bu biraz bağımlılık cehennemden çıktı. çalışıyordu dist-upgradeama çok kullanmak için gereken bazı paketler kaybetmez aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')hile yaptım!
Jayen,

11

"Apticron" paketine bakınız:

apticron - Bekleyen paket güncellemeleri hakkında mesaj gönderebileceğiniz basit bir araç

Apticron, güvenlik güncellemeleri gibi bekleyen paket güncellemeleri hakkında günlük e-postalar gönderen, paketleri hem bekletme hem de yetenek olarak düzgün bir şekilde bekleten basit bir komut dosyasıdır.

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


Bağlantınız koptu ...
Alexis Wilke

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

mevcut yüklemeleri gerçekten yüklemeden listeler.

İlk komut, simüle (yani -s) yükseltme yapılmadan önce paket dizin dosyalarını günceller. "-s", kurulacak paketleri gösteren ancak gerçekte hiçbir şey yüklemeyecek benzetilmiş bir yükseltme yapacak.

Aksine, "-s" yerine "-u" aslında onaydan sonra yüklenir.


2
Simülasyon seçeneği herhangi biriyle tetiklenebilir -s, --simulate, --just-print, --dry-run, --recon, --no-act, keşif ve kuru çalıştırma benim kişisel favorilerim.
ThorSummoner

9

Olası güncellemeler hakkında tam sürüm bilgisine ihtiyacım vardı, bu yüzden jasonwryan'ın cevabını değiştirdim:

apt-get -V -u upgrade

Basit ve IMO makul formatlanmış çıktı.


3

Sadece çıktısını filtrelemek

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

günlüğünde yalnızca tercih edilen bilgilere sahip olmak için.

Büyük olasılıkla, hattan sonra güzel bölüme ihtiyacınız olacak.

...

Aşağıdaki paketler yükseltilecek:

...

başlangıçta çok az boşluk var.


Merhaba ve siteye hoşgeldiniz. Durduğu gibi, cevabınız temelde varolanların bir ifadesidir ve yeni bir şey eklemez. Çeşitli anahtarlar vb ne bir açıklama ekleyerek, filtre çıkış nasıl açıklayan, örneğin, bunu geliştirmek
Terdon

2

Esinlenerek on-astar Jet başka, bu cevap :

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;

Çıktı şöyle görünür (renkli):

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

Kısa tanımı istemiyorsanız bunu kullanın:

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

Çıktı:

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)

Bir liner fantastik, ancak bazı paketlerin açıklamasını çıkarmaz.
ychaouche

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

cron e-postaları için en basittir; kullanıcı yinelemesi yoktur ve güncelleme yoksa çıktı da olmaz.


1

@ Jasonwryan'ın cevabına uyarı yazdıktan sonra, kendi çözümümü sunmak istiyorum:

apt-get dist-upgrade --assume-no

Ne yazık ki, bu debian wheezy ile çalışmıyor ve hala yükseltilmemiş bazı LXC kapları kontrol etmek zorunda kaldı. Bu form her zaman çalışacaktır:

apt-get dist-upgrade </dev/null

Sonunda çıktıyı yeniden biçimlendirmek istedim. --dry-runDaha güvenli hissettirdiği için tekrar aramayı değiştirmeyi seçtim ( tüm ek çıkışları kullanarak ancak yok sayarak):

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

İade:

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

1

apt-check Muhtemelen en verimli komut dosyası yöntemidir.

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

Çok küçük bir değişiklik sadece güvenlik güncellemelerini gösterir.

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

0

Bir varyasyon olarak aşağıdakileri kullanıyorum:

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

Adında bir betiğe yapıştırın apt-updatesve sonra apt-updateskullanıcı ne olursa olsun tüm güncellemelerin bir listesini almak için arayabilirsiniz .

Yine de apt-get updateayrıcalıklı erişim ile aramanız gerekir .


çıktı sadece paket adını gösterir (ilk sütun), ikinci sütun daima "=" basar ve üçüncü sütun daima boştur. Nane'deyim.
ychaouche


0

Bunu kullanmayı seviyorum:

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

Bunun gibi bir çıktı alırsınız:

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

Mevcut güncellemeler varsa ve hiçbiri varsa. Bu şekilde bir izleme çözümü ile kolayca birleştirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.