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?

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

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,


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

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

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

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


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.


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.


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.


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)

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.


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

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

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.


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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.