Daftar pembaruan yang tersedia tetapi jangan menginstalnya

209

Saya ingin skrip pelaporan yang dijalankan cron memberi tahu saya jika ada pembaruan untuk paket saya. Apakah cara untuk apt-getmemberi saya daftar pembaruan yang tersedia tetapi tidak melakukan apa-apa lagi?

Morris
sumber

Jawaban:

231

tepat

Untuk versi modern aptada saklar khusus untuk ini:

apt list --upgradable

apt-get

Untuk apt-getperintah lama , -usakelar menampilkan daftar paket yang tersedia untuk ditingkatkan:

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

Dari apt-gethalaman manual :

-u
--show-upgrade
 Tampilkan paket yang ditingkatkan; Cetak daftar semua paket yang akan ditingkatkan. Item Konfigurasi: APT :: Get :: Show-Upgrade.
--assume-no  Otomatis "tidak" ke semua prompt. <== Untuk mencegahnya mulai menginstal
jasonwryan
sumber
2
Saya berharap ini bisa dilakukan tanpa root
ThorSummoner
19
Jika Anda mengetik "Y" dan menekan Enter, perintah ini akan menginstal pembaruan. Saya pasti akan merekomendasikan untuk menambahkan "-s", jika tidak, jawaban ini menyesatkan
Murmel
5
Ini adalah jawaban yang sangat salah karena (tanpa opsi tambahan) perintah menunggu input dan jika pengguna memasukkan input yang salah, paket diinstal, yang memodifikasi sistem yang bukan apa yang diinginkan OP (hanya terjadi pada sistem saya)
Daniel Alder
Dan btw: -uadalah opsi defaultapt-get
Daniel Alder
1
@ThorSummoner '-s' akan melakukan apa yang Anda inginkan & bekerja tanpa root
nevelis
67
apt-get --just-print upgrade

Tidak dibaca dengan mudah, di bawah ini adalah perl one liner untuk mem-parsing keluaran apt-get:

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

Ini akan menghasilkan sesuatu seperti:

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

Semoga itu akan membantu orang lain,

Tom
sumber
1
hanya untuk tertawa: apt-get -s upgrade | awk -F '[] [()] +' '/ ^ Inst / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
tink
8
Ini juga bisa menjadi jauh lebih columnapt-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
cantik
1
@AntonioK Tampak hebat!
nick
1
Saya khawatir Perl-kode ini akan meretas mesin saya ...;)
Chris
33

Pilihan lain, terinspirasi oleh enzotib:

aptitude search '~U' | wc -l

Perintah ini akan menggunakan aptitude untuk menampilkan paket-paket baru dan kemudian wc untuk hanya menghitung baris.

Pada sidenote, saya menemukan bahwa solusi enzotib tanpa tanda kutip tunggal di sekitar ~ U tidak bekerja untuk saya. (Wheezy, ZSH, bakat 0.6.8.2)

Perbarui:

Dengan apt baru yang dapat Anda lakukan sekarang:

apt list --upgradable
cete3
sumber
Terima kasih untuk ini, perintah daftar apt adalah persis apa yang saya inginkan.
dvorak
Bagus dengan solusi ini adalah Anda tidak perlu sudo / root.
Gunni
25

Yang termudah adalah:

apt list --upgradable
AJM
sumber
tidak bekerja pada mint.
ychaouche
1
Sayang sekali ini tidak mengembalikan kode keluar yang berbeda tergantung pada apakah ada peningkatan yang tersedia atau tidak. Pasti menyenangkan bisa menggunakan ini dalam skrip.
Dale Anderson
18

Anda bisa lari

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

atau yang tidak berdokumen

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

Metode lain menggunakan apt-getsimulasi:

apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
enzotib
sumber
1
Perintah bakat ini bekerja sangat baik untuk saya dan tidak memerlukan root
JamesCW
apt-get -s dist-upgrade bekerja dengan baik juga dan memiliki output yang sama ketika Anda menyalurkannya melalui awker itu
ychaouche
Terima kasih! ini keluar dari neraka ketergantungan. berusaha dist-upgradetetapi tidak kehilangan beberapa paket sehingga perlu digunakan aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')lakukan triknya!
Jayen
11

Lihatlah paket "apticron":

apticron - Alat sederhana untuk mengirim email tentang pembaruan paket yang tertunda

Apticron adalah skrip sederhana yang mengirim email setiap hari tentang pembaruan paket yang tertunda seperti pembaruan keamanan, menangani paket-paket yang ditahan dengan baik oleh dselect dan aptitude.

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

f4m8
sumber
Tautan Anda rusak ...
Alexis Wilke
10
apt-get update && apt-get -s upgrade

akan mendaftar pembaruan yang tersedia tanpa benar-benar menginstal.

Perintah pertama memperbarui file indeks paket sebelum peningkatan disimulasikan (dengan demikian -s) dilakukan. "-s" akan melakukan peningkatan yang disimulasikan yang memperlihatkan paket yang akan diinstal tetapi sebenarnya tidak akan menginstal apa pun.

Sebaliknya "-u" bukannya "-s" akan benar-benar dipasang setelah konfirmasi.

ajaaskel
sumber
2
Opsi simulasi dapat dipicu dengan salah satu dari -s, --simulate, --just-print, --dry-run, --recon, --no-act, pengintaian dan pengeringan adalah favorit pribadi saya.
ThorSummoner
9

Saya memerlukan informasi versi lengkap tentang kemungkinan peningkatan, jadi saya menggunakan modifikasi jawaban jasonwryan:

apt-get -V -u upgrade

Ini sederhana dan output IMO diformat secara wajar.

Ben Brian
sumber
3

Cukup filter keluaran

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

hanya memiliki informasi yang disukai di log Anda.

Kemungkinan besar, Anda akan membutuhkan bagian yang indah setelah garis

...

Paket-paket berikut akan ditingkatkan:

...

yang memiliki beberapa ruang di awal.

freealx
sumber
Hai dan selamat datang di situs ini. Seperti berdiri, jawaban Anda pada dasarnya adalah pengulangan dari yang sudah ada dan jadi tidak menambahkan sesuatu yang baru. Anda dapat memperbaikinya dengan, misalnya, menjelaskan cara memfilter output, menambahkan penjelasan tentang apa yang dilakukan berbagai switch, dll.
terdon
2

Jet lain on-liner, terinspirasi oleh jawaban ini :

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;

Outputnya terlihat seperti ini (berwarna):

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

Jika Anda tidak ingin deskripsi singkat gunakan yang ini:

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

Keluaran:

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)
Compilenix
sumber
Liner satu fantastis, kecuali itu tidak menampilkan deskripsi beberapa paket.
ychaouche
2
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "

adalah yang paling sederhana untuk email cron; tidak ada iterasi pengguna, dan jika tidak ada pembaruan tidak ada output.

pengguna1133275
sumber
1

Setelah menulis peringatan untuk jawaban @ jasonwryan, saya ingin memberikan solusi sendiri:

apt-get dist-upgrade --assume-no

Sayangnya, yang ini tidak berfungsi dengan debian wheezy dan saya harus memeriksa beberapa kontainer lxc yang masih belum diupgrade. Formulir ini akan selalu berfungsi:

apt-get dist-upgrade </dev/null

Akhirnya, saya juga ingin memformat ulang output. Saya memilih untuk mengubah panggilan lagi (menggunakan --dry-runtetapi mengabaikan semua output tambahan) karena rasanya lebih aman:

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

Pengembalian:

The following packages have been kept back:
  iproute
The following packages will be upgraded:
  unzip
Daniel Alder
sumber
1

apt-check mungkin metode scripting yang paling efisien.

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

Modifikasi yang sangat kecil hanya menunjukkan kepada Anda pembaruan keamanan.

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

Sebagai variasi, saya menggunakan yang berikut ini:

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

Masukkan ke dalam skrip bernama apt-updatesdan Anda kemudian dapat menelepon apt-updatesuntuk mendapatkan daftar semua pembaruan terlepas dari pengguna.

Anda masih perlu menelepon apt-get updatedengan akses istimewa.

Brett Ryan
sumber
output hanya menampilkan nama paket (kolom pertama), kolom kedua selalu mencetak "=" dan kolom ketiga selalu kosong. Saya di Mint.
ychaouche
0

Ada apt-show-versionsalatnya. Untuk menampilkan pembaruan yang tersedia jalankan:

apt-show-versions -u
agc
sumber
0

Saya suka menggunakan ini:

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

Anda mendapatkan output seperti ini:

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

jika ada pembaruan yang tersedia, dan tidak ada jika tidak ada. Dengan cara ini Anda cukup memasangkannya dengan solusi pemantauan.

pengguna3310438
sumber