it-mot-dan-vi.com

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

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. Là cách để làm apt-get cho 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?

231
Morris

đúng cách

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

apt list --upgradeable

apt-get

Dành cho người già apt-get ra lệnh cho -u switch 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-get trang nam :

-u
[.__.] - nâng cấp chương trình
 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-không Tự động "không" cho tất cả các lời nhắc. <== Để ngăn nó bắt đầu cài đặt
255
jasonwryan
apt-get --just-print upgrade

Không dễ đọc, bên dưới là một lớp lót Perl để 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,

67
Tom

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 không có dấu ngoặc đơn xung quanh ~U không làm việc cho 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:

apt list --upgradeable

34
cete3

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

apt list --upgradeable

27
AJM

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 thức khác sử dụng apt-get mô phỏng:

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

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

11
f4m8
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.

10
ajaaskel

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.

9
Ben Brian

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.

3
freealx

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)
2
Compilenix
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.

2
user1133275

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
1
flickerfly

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-run như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
Daniel Alder

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-updates và 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 gọi apt-get update với quyền truy cập đặc quyền.

0
Brett Ryan

apt-show-versions công cụ. Để hiển thị các bản cập nhật có sẵn chạy:

apt-show-versions -u
0
agc

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.

0
user3310438