Liệt kê các bản cập nhật có sẵn nhưng không cài đặt chúng


209

Tôi muốn tập lệnh báo cáo chạy cron của tôi thông báo cho tôi trong trường hợp có bản cập nhật cho các gói của tôi. Có phải là một cách để đưa apt-getcho tôi danh sách các bản cập nhật có sẵn nhưng không làm gì thêm?

Câu trả lời:


231

đúng cách

Đối với các phiên bản hiện đại, aptcó một công tắc cụ thể cho việc này:

apt list --upgradable

apt-get

Đối với apt-getlệnh cũ , -ucông tắc hiển thị danh sách các gói có sẵn để nâng cấp:

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

Từ apt-gettrang người đàn ông :

-u
-
 Hiển thị các gói nâng cấp; In ra một danh sách tất cả các gói sẽ được nâng cấp. Mục cấu hình: APT :: Get :: Show-Upgraded.
--assume-no  Tự động "không" cho tất cả các lời nhắc. <== Để ngăn nó bắt đầu cài đặt

2
Tôi đã hy vọng điều này có thể được thực hiện mà không cần root
ThorSummoner 6/2/2015

19
Nếu bạn gõ "Y" và nhấn Enter, lệnh này sẽ cài đặt các bản cập nhật. Tôi chắc chắn sẽ khuyên bạn nên thêm "-s", nếu không câu trả lời này là sai lệch
Murmel

5
Đây là một câu trả lời rất sai vì (không có tùy chọn bổ sung) lệnh chờ đầu vào và nếu người dùng nhập sai, gói được cài đặt, điều chỉnh hệ thống không phải là điều OP muốn (chỉ xảy ra trên hệ thống của tôi)
Daniel Alder

Và btw: -ulà một tùy chọn mặc định củaapt-get
Daniel Alder

1
@ThorSummoner '-s' sẽ làm những gì bạn muốn và hoạt động mà không cần root
nevelis

67
apt-get --just-print upgrade

Không dễ đọc, bên dưới là một lớp lót để phân tích đầu ra của 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"}'

Điều này sẽ xuất ra một cái gì đó như:

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

Hy vọng nó sẽ giúp người khác,


1
chỉ để cười: nâng cấp apt-get -s | awk -F '[] [()] +' '/ ^ Inst / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
tink

8
Nó cũng có thể trông đẹp hơn nhiều, nếu sử dụng columnnhư thế này: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 Trông thật tuyệt!
nick

1
Tôi sợ mã Perl này sẽ hack máy của tôi ...;)
Chris

33

Một lựa chọn khác, lấy cảm hứng từ enzotib:

aptitude search '~U' | wc -l

Lệnh này sẽ sử dụng aptitude để xuất các gói mới và sau đó wc để chỉ đếm các dòng.

Trong một sidenote, tôi thấy rằng giải pháp của enzotib mà không có trích dẫn nào xung quanh ~ U không hiệu quả với tôi. (Wheezy, ZSH, năng khiếu 0.6.8.2)

Cập nhật:

Với apt mới bạn có thể làm ngay bây giờ:

apt list --upgradable

Cảm ơn vì điều này, lệnh danh sách apt là chính xác những gì tôi muốn.
dvorak

Tuyệt vời với giải pháp này là bạn không cần sudo / root.
Gunni

25

Đơn giản nhất là:

apt list --upgradable

không hoạt động trên bạc hà.
ychaouche

1
Thật đáng tiếc vì điều này không trả về các mã thoát khác nhau tùy thuộc vào việc có nâng cấp hay không. Sẽ thật tuyệt khi có thể sử dụng điều này trong một kịch bản.
Dale Anderson

18

Bạn có thể chạy

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

hoặc không có giấy tờ

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

Một phương pháp khác sử dụng apt-getmô phỏng:

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

1
Lệnh aptitude này hoạt động rất tốt đối với tôi và không yêu cầu root
JamesCW

apt-get -s dist-nâng cấp cũng hoạt động tốt và có đầu ra tương tự khi bạn chuyển nó qua kẻ lừa đảo đó
ychaouche

cảm ơn bạn! Điều này đã thoát ra khỏi một chút địa ngục phụ thuộc. đã cố gắng dist-upgradenhưng không mất một số gói cần thiết để sử dụng aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')đã lừa
Jayen

11

Hãy xem gói "apticron":

apticron - Công cụ đơn giản để gửi thư về việc cập nhật gói đang chờ xử lý

Apticron là một tập lệnh đơn giản gửi email hàng ngày về các bản cập nhật gói đang chờ xử lý, chẳng hạn như cập nhật bảo mật, xử lý đúng các gói được giữ cả bởi DSelect và aptitude.

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


Liên kết của bạn bị hỏng ...
Alexis Wilke

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

sẽ liệt kê các bản cập nhật có sẵn mà không thực sự cài đặt.

Lệnh đầu tiên cập nhật các tệp chỉ mục gói trước khi nâng cấp mô phỏng (do đó -s) được thực hiện. "-s" sẽ thực hiện nâng cấp mô phỏng hiển thị các gói sẽ được cài đặt nhưng thực tế sẽ không cài đặt bất cứ thứ gì.

Ngược lại, "-u" thay vì "-s" sẽ thực sự cài đặt sau khi xác nhận.


2
Tùy chọn mô phỏng có thể được kích hoạt với bất kỳ -s, --simulate, --just-print, --dry-run, --recon, --no-act, điều chỉnh và chạy khô là sở thích cá nhân của tôi.
ThorSummoner

9

Tôi cần thông tin phiên bản đầy đủ về các nâng cấp có thể, vì vậy tôi đã sử dụng sửa đổi câu trả lời của jasonwryan:

apt-get -V -u upgrade

Đó là đầu ra được định dạng hợp lý và đơn giản.


3

Chỉ cần lọc đầu ra của

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

để chỉ có thông tin ưa thích trong nhật ký của bạn.

Rất có thể, bạn sẽ cần phần đẹp sau dòng

...

Các gói sau sẽ được nâng cấp:

...

có ít khoảng trống ở đầu


Xin chào và chào mừng đến với trang web. Như hiện tại, câu trả lời của bạn về cơ bản là một bản tóm tắt của những cái hiện có và do đó không thêm bất cứ điều gì mới. Bạn có thể cải thiện nó bằng cách, ví dụ, giải thích cách lọc đầu ra, thêm giải thích về những gì các công tắc khác nhau làm, v.v.
terdon

2

Máy bay phản lực khác, lấy cảm hứng từ câu trả lời này :

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;

Đầu ra trông như thế này (màu):

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

Nếu bạn không muốn mô tả ngắn, hãy sử dụng mô tả này:

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

Đầu ra:

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)

Một lớp lót là tuyệt vời, ngoại trừ nó không đưa ra mô tả của một số gói.
ychaouche

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

là đơn giản nhất cho các email cron; không có người dùng lặp lại, và nếu không có bản cập nhật thì không có đầu ra.


1

Sau khi viết cảnh báo cho câu trả lời của @ jasonwryan, tôi muốn cung cấp giải pháp của riêng mình:

apt-get dist-upgrade --assume-no

Thật không may, cái này không hoạt động với debian wheezy và tôi đã phải kiểm tra một số container lxc vẫn chưa được nâng cấp. Hình thức này sẽ luôn hoạt động:

apt-get dist-upgrade </dev/null

Cuối cùng, tôi cũng muốn định dạng lại đầu ra. Tôi đã chọn thay đổi cuộc gọi một lần nữa (sử dụng --dry-runnhưng bỏ qua tất cả đầu ra bổ sung) vì cảm thấy an toàn hơn:

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

Trả về:

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

1

apt-check có lẽ là phương pháp kịch bản hiệu quả nhất.

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

Một sửa đổi rất nhỏ chỉ cho bạn thấy các bản cập nhật bảo mật.

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

0

Là một biến thể tôi sử dụng như sau:

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

Dán nó vào một tập lệnh có tên apt-updatesvà sau đó bạn có thể gọi apt-updatesđể có được danh sách tất cả các bản cập nhật bất kể người dùng.

Bạn vẫn cần phải gọi apt-get updatevới quyền truy cập đặc quyền.


đầu ra chỉ hiển thị tên gói (cột thứ nhất), cột thứ hai luôn in "=" và cột thứ ba luôn trống. Tôi đang dùng Mint.
ychaouche


0

Tôi thích sử dụng cái này:

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

Bạn nhận được một đầu ra như thế này:

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

nếu có bản cập nhật có sẵn, và không có nếu không có. Bằng cách này, bạn có thể chỉ cần ghép nó với một giải pháp giám sát.

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.