Làm thế nào tôi có thể cài đặt chỉ cập nhật bảo mật từ dòng lệnh?


333

sudo apt-get upgradecài đặt tất cả các bản cập nhật, không chỉ cập nhật bảo mật. Tôi biết rằng tôi có thể sử dụng Trình quản lý cập nhật để chỉ chọn các cập nhật bảo mật quan trọng, nhưng có cách nào để thực hiện việc này từ dòng lệnh không?


2
Tôi không nghĩ vậy. nâng cấp dist đưa toàn bộ hệ thống lên một bản phát hành mới. Tôi đang nói về các bản cập nhật hàng ngày, giống như các bản cập nhật bạn thấy trong Trình quản lý cập nhật.
Michael Crenshaw

1
Ồ, tôi thấy những gì bạn đang nói bây giờ. Heh, tôi chạy apt-get update thường xuyên, tôi gõ nó mà không cần suy nghĩ. Cảm ơn cho những người đứng đầu lên!
Michael Crenshaw

7
Bạn muốn "apt-get dist-Nâng cấp", không phải "nâng cấp apt-get". "Nâng cấp từ xa" không dành cho các bản phát hành mới (đó là "do-phát hành-nâng cấp" một lệnh riêng). Sử dụng "nâng cấp từ xa" có nghĩa là nó sẽ xử lý các phụ thuộc thay đổi của các gói mới. Điều này có thể quan trọng.
Kees Cook

3
nâng cấp dist là hoạt động bình thường được thực hiện bởi GUI của Trình quản lý cập nhật. Đối với các gói như kernel có linux-image-genericgói, tùy thuộc vào hình ảnh hiện tại, ví dụ linux-image-3.x.y-zz-generic(mỗi phiên bản có tên gói riêng), nâng cấp (cho phép các gói mới được cài đặt để đáp ứng phụ thuộc) sẽ thực hiện nâng cấp này , trong khi nâng cấp sẽ hiển thị gói kernel dưới dạng giữ lại.
viêm chron

3
Đáng ngạc nhiên là không có apt-getcâu trả lời tốt dựa trên điều này, xem xét mức độ nổi bật của nó được liệt kê trên mỗi máy chủ
Karthik T

Câu trả lời:


308

Gói nâng cấp không giám sát cung cấp chức năng tự động cài đặt các bản cập nhật bảo mật.

Bạn có thể sử dụng phần này, nhưng thay vì định cấu hình phần tự động, bạn có thể gọi nó bằng tay:

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

Thay vào đó, nếu bạn muốn chạy nó một cách lặng lẽ:

sudo unattended-upgrade

LƯU Ý: Khi bạn gọi nâng cấp không giám sát, bạn sẽ bỏ "s" ở cuối.

Điều này giả định rằng gói được cài đặt theo mặc định, có lẽ là như vậy. Nếu không, chỉ cần làm:

sudo apt-get install unattended-upgrades

Xem thêm /usr/share/doc/unattended-upgrades/README.md.


Để vô hiệu hóa việc thực thi tự động của unattended-upgradebạn có lẽ cần phải sửa đổi /etc/cron.daily/apt, nhưng không chắc chắn đó là "chính xác" để làm như vậy
Jaime Hablutzel

lưu ý phụ: đối với máy chủ Ubuntu 12.04.5 LTS, unattended-upgradeskhông được cài đặt theo mặc định.
Raptor

13
Vì bạn đang làm điều này từ dòng lệnh, hãy sử dụng -vcho thông báo thông tin hoặc -dcho thông báo gỡ lỗi. Nếu không, tiện ích sẽ rất im lặng, trong trường hợp đó bạn sẽ cần kiểm tra nhật ký /var/log/unattended-upgrades. Bạn cũng có thể sử dụng --dry-runđể mô phỏng nhưng không thực sự nâng cấp bất cứ thứ gì. Để biết thêm thông tin và các tùy chọn khác, sử dụng --helpđể nhận thông báo trợ giúp.
ADTC

tôi đã học được một vài điều về unattended-upgradesngày hôm nay. cảm ơn!
the0ther

"Để theo dõi nó diễn ra như thế nào", nó chỉ là gỡ lỗi các tin nhắn không tương tác phải không?
Sức mạnh Bảo Bình

116

Một vài lời khuyên về cách quản lý cập nhật

Điều này áp dụng cho cả Debian và Ubuntu, nhưng các hướng dẫn cụ thể hơn cho Ubuntu tuân theo.

  • Chỉ hiển thị cập nhật bảo mật:

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

    hoặc là

    sudo unattended-upgrade --dry-run -d
    

    hoặc là

    /usr/lib/update-notifier/apt-check -p
    
  • Hiển thị tất cả các gói có thể nâng cấp

    apt-get -s dist-upgrade | grep "^Inst"
    
  • Chỉ cài đặt cập nhật bảo mật

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

Ghi chú:

  • Đôi khi Ubuntu hiển thị các cập nhật bảo mật như thể chúng đến từ kho lưu trữ cập nhật $ phát hành. Điều này là như vậy, tôi đã nói, bởi vì các nhà phát triển Ubuntu đẩy các bản cập nhật bảo mật lên kho lưu trữ cập nhật $ phát hành cũng như để tăng tốc độ sẵn có của họ.

    Nếu đó là trường hợp, bạn có thể làm như sau để chỉ hiển thị cập nhật bảo mật:

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

    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'}
    
  • Kiểm tra những dịch vụ cần được khởi động lại sau khi nâng cấp gói. Chỉ ra các gói bạn sẽ nâng cấp trước và lên lịch khởi động lại / khởi động lại. Vấn đề ở đây là trừ khi bạn khởi động lại dịch vụ, nó vẫn có thể sử dụng phiên bản cũ hơn của thư viện (lý do phổ biến nhất) được tải vào bộ nhớ trước khi bạn cài đặt gói mới khắc phục lỗ hổng bảo mật hoặc bất cứ điều gì.

    checkrestart -v
    

    Tuy nhiên, hãy nhớ rằng checkrestartcó thể liệt kê các quy trình không nhất thiết phải được khởi động lại. Ví dụ: dịch vụ PostgreSQL có thể lưu trong bộ nhớ tham chiếu đến tệp xlog đã bị xóa, đây không phải là lý do hợp lệ để khởi động lại dịch vụ.

    Do đó, một cách khác, đáng tin cậy hơn, để kiểm tra điều này bằng cách sử dụng các tiện ích tiêu chuẩn là tập lệnh bash nhỏ sau đây mà tôi đã lấy cắp một cách đáng xấu hổ từ https://locallost.net/?p=233

    Nó kiểm tra xem các tiến trình đang chạy trên một hệ thống có còn sử dụng các thư viện bị xóa hay không bằng cách giữ các bản sao của chúng trong bộ nhớ hoạt động.

    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
    

1
Tôi chỉ thông báo bài này bây giờ. Nó là cực kỳ chính xác. Cảm ơn rất nhiều (+1)
Danduk82

'checkrestart' đến từ đâu? Tôi không thể tìm thấy nó trong Ubuntu Trusty. Tôi đã tìm thấy "Needrestart" có vẻ như nó sẽ phù hợp với hướng dẫn của bạn?
Ben XO

Nó có thể được tìm thấy trong gói debian-goodies: tests.debian.org/wheezy/debian-goodies . Ngoài ra còn có nhu cầu. Bạn có thể tìm thấy cả hai trên Xenial bằng cách chạy: kiểm tra tìm kiếm $ apt-cache
ILIV

Tôi nhận được "E: Không thể mở tệp khóa / var / lib / dpkg / lock - open (13: Quyền bị từ chối)" ngay cả với sudo. Đây có phải là một cái gì đó cụ thể cho một trong các bản cập nhật hoặc các lệnh bạn đã cung cấp không?
Nathan Hornby

Rất có thể đó là về việc chấm dứt dpkg không chính xác / bất thường khiến cho một tệp khóa không rõ ràng. Không xảy ra bình thường cho đến khi, ví dụ như cài đặt gói không hoàn thành thành công (đĩa đầy đủ, v.v.) Bạn có thể không thể chạy các lệnh apt-get và dpkg khác, bạn có thể không?
ILIV

46

thay thế /etc/apt/preferencesbằng cách sau:

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

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

bây giờ đơn giản apt-get upgradesẽ chỉ nâng cấp tất cả các cập nhật bảo mật.

Tại sao (và làm thế nào) điều này hoạt động: Tệp tùy chọn sẽ ghim tất cả các gói từ phân phối Ubuntu sang mức ưu tiên 50, điều này sẽ khiến chúng ít được mong muốn hơn các gói đã cài đặt. Các tệp có nguồn gốc từ kho lưu trữ bảo mật được ưu tiên mặc định (500) để chúng được xem xét để cài đặt. Điều này có nghĩa là chỉ các gói được coi là mong muốn hơn các gói hiện được cài đặt là các bản cập nhật bảo mật. Thông tin thêm về ghim trong trang web apt_preferences .

Bạn có thể tạm thời quảng cáo một bản phân phối nhất định cho các bản cập nhật với --target-releasetùy chọn hoạt động cùng apt-getaptitude(ít nhất) sẽ cho phép bạn ghim các bản phát hành nhất định để chúng đủ điều kiện nâng cấp.

Nếu bạn chỉ muốn sử dụng điều này cho các tập lệnh và không làm cho nó mặc định cho hệ thống, bạn có thể đặt các quy tắc vào một số vị trí khác và sử dụng điều này thay thế:

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

Điều này sẽ làm cho apt tìm tệp ưu tiên từ một vị trí không mặc định.

Tệp tùy chọn được cung cấp dưới dạng ví dụ không áp dụng cho kho lưu trữ của bên thứ ba, nếu bạn muốn ghim những tệp đó, bạn có thể sử dụng apt-cache policyđể dễ dàng xác định các khóa cần thiết để ghim.


Cảm ơn đã dành thời gian cho một câu trả lời kỹ lưỡng. Tôi nghĩ rằng tôi hiểu làm thế nào nó hoạt động. Nhưng khi tôi tạo tệp / etc / apt / Preferences và chạy nâng cấp apt-get, nó muốn nâng cấp tất cả các gói, không chỉ cập nhật bảo mật. Việc nâng cấp danh sách trước và sau hoàn toàn giống nhau, ngoại trừ với / etc / apt / Preferences, nó không muốn nâng cấp Leafpad, mà tôi đã xây dựng từ nguồn và cài đặt "bằng tay" với dpkg. Nó rất lạ đối với tôi, nhưng có thể có ý nghĩa với bạn.
Michael Crenshaw

1
Bạn có thể thấy những gì đang xảy ra với lệnh chính sách apt-cache. Chọn một trong các gói không được sửa lỗi bảo mật và chạy apt-cache policy packagename. Điều này sẽ liệt kê các ưu tiên cho các phiên bản khác nhau. Bạn sẽ thấy các dòng khác nhau và các ưu tiên khác nhau. Nếu không có dòng nào có mức độ ưu tiên 50, thì việc ghim sẽ không ảnh hưởng đến các gói được đề cập vì một số lý do.
Ressu

1
Tôi đã làm theo câu trả lời này trong quá khứ. Hôm nay tôi phát hiện ra rằng do câu trả lời này, 68 gói cập nhật bảo mật KHÔNG được cài đặt trên máy chủ của tôi và không hiển thị là ứng viên cài đặt tiềm năng. Đây không phải là một TRẢ LỜI TỐT!
Bóng râm

12

Những điều sau đây được xác nhận trong Ubuntu 14.04 LTS.

Sử dụng unattended-upgradegói.

Nhìn vào tập tin /etc/apt/apt.conf.d/50unattended-upgrades. Cần có một phần ở trên cùng là:

// 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";
};

Lưu ý cách nó được cấu hình để chỉ cho phép nâng cấp không giám sát cho các gói bảo mật, theo mặc định.

Sửa đổi tệp /etc/apt/apt.conf.d/10periodictương tự như:

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

Điều này sẽ chạy nâng cấp bảo mật tự động không giám sát, một lần mỗi ngày.

Bây giờ, để chạy thủ công : sudo unattended-upgrade.

Để kiểm tra dưới dạng chạy khô, không làm gì cả : sudo unattended-upgrade --dry-run.

Nguồn: https://help.ubfox.com/14.04/serverguide/automatic-updates.html


Có cách nào để thực hiện điều này một lịch trình hàng tháng?
mike.b93

1
@ mike.b93, tôi tin rằng cài đặt APT::Periodic::Unattended-Upgrade "30";sẽ làm điều này - cứ sau 30 ngày.
vcardillo

5

Mặc dù nó khá xấu, nhưng bạn có thể vô hiệu hóa tất cả các kho lưu trữ ngoài kho lưu trữ bảo mật và sau đó thực hiện:

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

Tôi đã không kiểm tra nó, nhưng trên lý thuyết, nó sẽ chỉ tìm thấy các bản cập nhật trong repo bảo mật và áp dụng chúng ...


Vâng, đó là một khả năng. Tôi sẽ xem xét nó. Tôi không giỏi về BASH, nhưng tôi có thể cố gắng tạo ra một kịch bản để làm điều đó.
Michael Crenshaw

OK, tôi đã vô hiệu hóa tất cả trừ repos bảo mật Ubuntu và chạy sudo apt-get update && sudo apt-get upgrade(hủy trước khi thực hiện bất kỳ nâng cấp nào). Sau đó, tôi kích hoạt lại tất cả các repos của mình, chạy sudo apt-get updateevà mở Trình quản lý cập nhật. Các gói được đánh dấu là cập nhật bảo mật không chính xác những gì apt-get upgradeđược tìm thấy, nhưng chúng rất gần - đủ gần với tôi. Tôi vẫn muốn tôi biết chính xác cách Update Manager thực hiện và cách thực hiện tương tự từ dòng lệnh, nhưng điều này sẽ làm được. Cảm ơn!
Michael Crenshaw

3
  • apt-get update: chỉ cần đọc các mục trong kho lưu trữ - theo danh sách hiện có. Cần kiểm tra những gì mới.
  • apt-get upgrade: tất cả các bản cập nhật cho các gói được cài đặt mà không có mô-đun hạt nhân. Không có bản cập nhật phát hành.
  • apt-get dist-upgrade: tất cả các bản cập nhật cho các gói đã cài đặt cũng với các mô-đun hạt nhân. Không có bản cập nhật phát hành.
  • apt-getvới tham số -s: chỉ kiểm tra, không có thay đổi được thực hiện.

0

Trên Debians tôi sử dụng lệnh này để chỉ cập nhật bảo mật:

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

0

Tôi không thể tìm thấy tùy chọn trong apt-get hoặc aptitude, tuy nhiên ai đó có cùng câu hỏi trên SuperUser. Câu trả lời duy nhất là:

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

Không trả lời cho dù điều đó làm việc tuy nhiên.


2
Dường như phương thức được mô tả trong trang wiki đó phụ thuộc vào việc đặt đối số --target-release của aptitude thành <release> -securance. Giống như OP của câu hỏi đó, phương pháp đó cài đặt tất cả các nâng cấp, không chỉ nâng cấp bảo mật. Đọc các trang man apt-get và aptitude, tôi không nghĩ rằng đối số --target-phát hành thậm chí còn nhằm hạn chế nâng cấp chỉ để bảo mật, mặc dù tôi không chắc nó chỉ dành cho mục đích gì.
Michael Crenshaw

0

Đây là một kịch bản đạt được điều này theo một số cách khác nhau:

#!/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)"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.