Bagaimana saya bisa menginstal pembaruan keamanan dari baris perintah?

333

sudo apt-get upgrademenginstal semua pembaruan, bukan hanya pembaruan keamanan. Saya tahu bahwa saya bisa menggunakan Pembaruan Manajer untuk memilih hanya pembaruan keamanan yang penting, tetapi apakah ada cara untuk melakukan ini dari baris perintah?

Michael Crenshaw
sumber
2
Saya kira tidak. dist-upgrade membawa seluruh sistem ke rilis baru. Saya berbicara tentang pembaruan sehari-hari, seperti yang Anda lihat di Pembaruan Manajer.
Michael Crenshaw
1
Oh, aku mengerti apa yang kamu katakan sekarang. Heh, saya menjalankan pembaruan apt-get begitu sering, saya mengetiknya tanpa berpikir. Terimakasih atas peringatannya!
Michael Crenshaw
7
Anda ingin "apt-get dist-upgrade", bukan "apt-get upgrade". "dist-upgrade" bukan untuk rilis baru (itu "do-release-upgrade" perintah terpisah). Menggunakan "dist-upgrade" berarti ia akan menangani perubahan dependensi dari paket baru. Ini penting.
Kees Cook
3
dist-upgrade adalah operasi normal yang dilakukan oleh GUI Pembaruan Manajer. Untuk paket-paket seperti kernel di mana ada linux-image-genericpaket, tergantung pada gambar saat ini, misalnya linux-image-3.x.y-zz-generic(setiap versi yang merupakan nama paket terpisah), dist-upgrade (yang memungkinkan paket-paket baru dipasang untuk memenuhi dependensi) akan melakukan pemutakhiran ini , sedangkan pemutakhiran akan menunjukkan paket kernel sebagai ditahan.
Kronik
3
Mengejutkan bahwa tidak ada apt-getjawaban berdasarkan yang bagus untuk ini, mengingat betapa jelasnya terdaftar di setiap server
Karthik T

Jawaban:

308

Paket peningkatan tanpa pengawasan menyediakan fungsionalitas untuk menginstal pembaruan keamanan secara otomatis.

Anda bisa menggunakan ini, tetapi alih-alih mengonfigurasi bagian otomatis Anda bisa menyebutnya secara manual:

sudo unattended-upgrade -d --dry-run
sudo unattended-upgrade -d

Jika Anda ingin menjalankannya dengan tenang:

sudo unattended-upgrade

CATATAN: Ketika Anda menelepon peningkatan tanpa pengawasan, Anda meninggalkan "s" dari ujung.

Ini mengasumsikan bahwa paket diinstal secara default, yang mungkin benar. Jika tidak, lakukan saja:

sudo apt-get install unattended-upgrades

Lihat juga /usr/share/doc/unattended-upgrades/README.md.

kebiru-biruan
sumber
Untuk menonaktifkan eksekusi otomatis unattended-upgradeAnda mungkin perlu memodifikasi /etc/cron.daily/apt, tetapi tidak yakin itu "benar" untuk melakukannya
Jaime Hablutzel
catatan samping: untuk server Ubuntu 12.04.5 LTS, unattended-upgradestidak diinstal secara default.
Raptor
13
Karena Anda melakukan ini dari baris perintah, gunakan -vuntuk pesan info atau -duntuk pesan debug. Kalau tidak, utilitas akan menjadi sangat sunyi, dalam hal ini Anda perlu memeriksa log /var/log/unattended-upgrades. Anda juga dapat menggunakan --dry-rununtuk mensimulasikan tetapi tidak benar-benar meningkatkan apa pun. Untuk info lebih lanjut dan opsi lain, gunakan --helpuntuk mendapatkan pesan bantuan.
ADTC
Saya belajar beberapa hal tentang unattended-upgradeshari ini. Terima kasih!
the0ther
"untuk memantau bagaimana kelanjutannya", itu hanya men-debug pesan non-interaktif bukan?
Aquarius Power
116

Beberapa Tips Cara Mengelola Pembaruan

Ini berlaku untuk Debian dan Ubuntu, tetapi mengikuti instruksi yang lebih spesifik untuk Ubuntu.

  • Hanya tampilkan pembaruan keamanan:

    apt-get -s dist-upgrade |grep "^Inst" |grep -i securi 
    

    atau

    sudo unattended-upgrade --dry-run -d
    

    atau

    /usr/lib/update-notifier/apt-check -p
    
  • Tampilkan semua paket yang dapat ditingkatkan

    apt-get -s dist-upgrade | grep "^Inst"
    
  • Instal pembaruan keamanan saja

    apt-get -s dist-upgrade | grep "^Inst" | 
        grep -i securi | awk -F " " {'print $2'} | 
        xargs apt-get install
    

Catatan:

  • Terkadang Ubuntu menunjukkan pembaruan keamanan seolah-olah itu berasal dari $ repositori-pembaruan repositori. Begitulah, saya diberitahu, karena pengembang Ubuntu mendorong pembaruan keamanan ke repositori $ release-updates juga untuk mempercepat ketersediaannya.

    Jika demikian, Anda dapat melakukan yang berikut untuk hanya menampilkan pembaruan keamanan:

    sudo sh -c 'grep ^deb /etc/apt/sources.list | 
        grep security > /etc/apt/sources.security.only.list'
    

    dan

    apt-get -s dist-upgrade -o Dir::Etc::SourceList=/etc/apt/sources.security.only.list -o Dir::Etc::SourceParts=/dev/null  | 
        grep "^Inst" | awk -F " " {'print $2'}
    
  • Periksa layanan apa yang perlu direstart setelah peningkatan paket. Cari tahu paket apa yang akan Anda tingkatkan sebelumnya dan jadwalkan restart / reboot Anda. Masalahnya di sini adalah bahwa kecuali Anda me-restart layanan itu masih mungkin menggunakan versi perpustakaan yang lebih lama (alasan paling umum) yang telah dimuat ke memori sebelum Anda menginstal paket baru yang memperbaiki kerentanan keamanan atau apa pun.

    checkrestart -v
    

    Namun, perlu diingat bahwa checkrestartmungkin daftar proses yang tidak harus dimulai kembali. Sebagai contoh, layanan PostgreSQL mungkin menyimpan referensi memorinya ke file xlog yang sudah dihapus, yang bukan alasan yang sah untuk memulai kembali layanan.

    Oleh karena itu, cara lain yang lebih andal untuk memeriksa ini menggunakan utils standar adalah skrip bash kecil berikut yang saya curi dari https://locallost.net/?p=233

    Ia memeriksa apakah proses yang berjalan pada suatu sistem masih menggunakan pustaka yang dihapus berdasarkan menyimpan salinannya dalam memori aktif.

    ps xh -o pid |
    while read PROCID; do
           grep 'so.* (deleted)$' /proc/$PROCID/maps 2> /dev/null
           if [ $? -eq 0 ]; then
                   CMDLINE=$(sed -e 's/\x00/ /g' < /proc/$PROCID/cmdline)
                   echo -e "\tPID $PROCID $CMDLINE\n"
           fi
    done
    
ILIV
sumber
1
Saya perhatikan baru sekarang posting ini. Ini sangat tepat. Terima kasih banyak (+1)
Danduk82
dari mana 'checkrestart' berasal? Saya tidak dapat menemukannya di Ubuntu Trusty. Saya menemukan "needrestart" yang sepertinya cocok dengan instruksi Anda?
Ben XO
Ini dapat ditemukan di paket debian-goodies: packages.debian.org/wheezy/debian-goodies . Ada juga kebutuhan untuk memulai. Anda dapat menemukan keduanya di Xenial dengan menjalankan: $ apt-cache search checkrestart
ILIV
Saya mendapatkan "E: Tidak dapat membuka file kunci / var / lib / dpkg / lock - open (13: Izin ditolak)" bahkan dengan sudo. Apakah ini sesuatu yang spesifik untuk salah satu pembaruan atau perintah yang Anda berikan?
Nathan Hornby
Kemungkinan besar ini tentang penghentian dpkg yang salah / tidak normal yang menyebabkan file kunci tidak jelas. Tidak terjadi secara normal sampai, mis. Instalasi suatu paket tidak selesai dengan sukses (disk penuh, dll.) Anda mungkin tidak dapat menjalankan perintah apt-get dan dpkg lainnya, bukan?
ILIV
46

ganti /etc/apt/preferencesdengan yang berikut ini:

Package: *
Pin: release a=lucid-security
Pin-Priority: 500

Package: *
Pin: release o=Ubuntu
Pin-Priority: 50

sekarang yang sederhana apt-get upgradeakan meningkatkan semua pembaruan keamanan saja.

Mengapa (dan bagaimana) ini berfungsi: File preferensi akan menyematkan semua paket dari distribusi Ubuntu ke prioritas 50, yang akan membuatnya kurang diinginkan daripada paket yang sudah diinstal. File yang berasal dari repositori keamanan diberi prioritas default (500) sehingga mereka dipertimbangkan untuk instalasi. Ini berarti bahwa hanya paket yang dianggap lebih diinginkan daripada yang diinstal saat ini adalah pembaruan keamanan. Informasi lebih lanjut tentang menyematkan di halaman apt_preferences .

Anda dapat sementara mempromosikan distribusi tertentu untuk pembaruan dengan --target-releaseopsi yang bekerja dengan apt-getdan aptitude(setidaknya) yang akan memungkinkan Anda menyematkan rilis tertentu sehingga mereka memenuhi syarat untuk ditingkatkan.

Jika Anda ingin menggunakan ini hanya untuk skrip dan tidak menjadikannya default untuk sistem, Anda dapat menempatkan aturan di beberapa lokasi lain dan menggunakan ini sebagai gantinya:

apt-get -o Dir::Etc::Preferences=/path/to/preferences_file upgrade

Ini akan membuat pencarian file preferensi dari lokasi yang tidak standar.

File preferensi yang diberikan sebagai contoh tidak berlaku untuk repositori pihak ketiga, jika Anda ingin menyematkannya juga dapat Anda gunakan apt-cache policyuntuk dengan mudah menentukan kunci yang diperlukan untuk menyematkan.

Ressu
sumber
Terima kasih telah meluangkan waktu untuk jawaban yang menyeluruh. Saya rasa saya mengerti cara kerjanya. Tetapi ketika saya membuat file / etc / apt / preferences dan menjalankan pemutakhiran apt-get, ia ingin memutakhirkan semua paket, bukan hanya pembaruan keamanan. Pemutakhiran daftar sebelum dan sesudah persis sama, kecuali dengan / etc / apt / preferensi ia tidak ingin memutakhirkan Leafpad, yang saya buat dari sumber dan menginstal "dengan tangan" dengan dpkg. Ini sangat aneh bagi saya, tetapi mungkin berarti bagi Anda.
Michael Crenshaw
1
Anda dapat melihat apa yang sedang terjadi dengan perintah kebijakan apt-cache. Pilih salah satu paket yang tidak mendapatkan perbaikan keamanan dan jalankan apt-cache policy packagename. Ini akan mendaftar prioritas untuk berbagai versi. Anda harus melihat berbagai garis dan prioritas yang berbeda. Jika tidak ada baris dengan prioritas 50, pinning tidak mempengaruhi paket yang dimaksud karena alasan tertentu.
Ressu
1
Saya telah mengikuti jawaban ini di masa lalu. Hari ini saya mengetahui bahwa karena jawaban ini, 68 paket pembaruan keamanan TIDAK diinstal pada server saya dan tidak muncul sebagai kandidat instalasi potensial. Ini BUKAN JAWABAN YANG BAIK!
Shade
12

Berikut ini dikonfirmasi di Ubuntu 14.04 LTS.

Gunakan unattended-upgradepaket.

Lihatlah filenya /etc/apt/apt.conf.d/50unattended-upgrades. Harus ada bagian di atas yaitu:

// Automatically upgrade packages from these (origin:archive) pairs
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
//  "${distro_id}:${distro_codename}-updates";
//  "${distro_id}:${distro_codename}-proposed";
//  "${distro_id}:${distro_codename}-backports";
};

Perhatikan bagaimana ini telah dikonfigurasi untuk hanya mengizinkan peningkatan tanpa pengawasan untuk paket keamanan, secara default.

Ubah file yang /etc/apt/apt.conf.d/10periodicmirip dengan:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

Ini akan menjalankan peningkatan keamanan tanpa pengawasan otomatis, sekali per hari.

Sekarang, untuk menjalankan secara manual: sudo unattended-upgrade.

Untuk menguji sebagai dry-run, tanpa melakukan apa-apa: sudo unattended-upgrade --dry-run.

Sumber: https://help.ubuntu.com/14.04/serverguide/automatic-updates.html

vcardillo
sumber
Apakah ada cara untuk membuat ini jadwal bulanan?
mike.b93
1
@ mike.b93, saya yakin pengaturan APT::Periodic::Unattended-Upgrade "30";akan melakukan ini - setiap 30 hari.
vcardillo
5

Meskipun sangat jelek, Anda bisa menonaktifkan semua repositori selain dari repositori keamanan dan kemudian lakukan:

sudo apt-get update && sudo apt-get upgrade

Saya belum mengujinya, tetapi secara teori hanya akan menemukan pembaruan dalam repo keamanan dan menerapkannya ...

Stephen RC
sumber
Ya, itu sebuah kemungkinan. Saya akan memeriksanya. Saya tidak pandai BASH, tetapi saya dapat mencoba membuat skrip untuk melakukannya.
Michael Crenshaw
OK, saya menonaktifkan semua kecuali repo keamanan Ubuntu dan menjalankan sudo apt-get update && sudo apt-get upgrade(membatalkan sebelum pemutakhiran dilakukan). Lalu saya mengaktifkan kembali semua repo saya, berlari sudo apt-get updatee, dan membuka Update Manager. Paket yang ditandai sebagai pembaruan keamanan tidak persis seperti yang apt-get upgradeditemukan, tetapi mereka sangat dekat - cukup dekat untuk saya. Saya masih berharap saya tahu persis bagaimana Update Manager melakukannya dan bagaimana melakukan hal yang sama dari command-line, tetapi ini akan berhasil. Terima kasih!
Michael Crenshaw
3
  • apt-get update: cukup baca entri dalam repositori - sesuai dengan daftar yang ada. Diperlukan untuk memeriksa apa yang baru.
  • apt-get upgrade: semua pembaruan untuk paket yang diinstal tanpa modul kernel. Tidak ada pembaruan rilis.
  • apt-get dist-upgrade: semua pembaruan untuk paket yang diinstal juga dengan modul kernel. Tidak ada pembaruan rilis.
  • apt-getdengan parameter -s: hanya tes, tidak ada perubahan yang dilakukan.
fuser
sumber
0

Pada Debian saya menggunakan perintah ini untuk melakukan hanya pembaruan keamanan:

apt-get install -y --only-upgrade $( apt-get --just-print upgrade | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq )
penekanan tombol
sumber
0

Saya tidak dapat menemukan opsi dalam apt-get atau aptitude, namun seseorang memiliki pertanyaan yang sama tentang SuperUser. Satu-satunya respons adalah:

Check and adjust /etc/apt/apt.conf.d/50unattended-upgrade. 
Did you replace 'karmic' with the code name of your Ubuntu?

Tidak ada jawaban, apakah itu berhasil.

Ross
sumber
2
Tampaknya metode yang dijelaskan dalam halaman wiki tergantung pada pengaturan argumen --target-release aptitude ke <release> -security. Seperti OP dari pertanyaan itu, metode itu menginstal semua pemutakhiran, bukan hanya pemutakhiran keamanan. Membaca-get apt dan bakat halaman manual, saya tidak berpikir --target-release argumen bahkan dimaksudkan untuk membatasi upgrade hanya keamanan, meskipun saya tidak yakin apa itu adalah untuk.
Michael Crenshaw
0

Berikut ini skrip yang mencapai ini dalam beberapa cara berbeda:

#!/usr/bin/env bash
set -e

# List upgradable packages
apt-get update
apt list --upgradable 2>/dev/null
# List security upgrades
test "$(apt-get upgrade -s -y)" && (apt-get upgrade -s -y)
# List upgradable apt packages then upgrade
apt-get update && apt-get upgrade -y  -V | grep '=>' | awk '{print$1}' && test "$(apt-get upgrade -y)"
Seth Bergman
sumber