แสดงรายการการอัพเดทที่มี แต่ไม่ได้ติดตั้ง


209

ฉันต้องการสคริปต์การรายงานที่ดำเนินการโดย cron เพื่อแจ้งให้ฉันทราบในกรณีที่มีการอัพเดตสำหรับแพ็คเกจของฉัน เป็นวิธีที่จะทำให้apt-getรายการอัปเดตที่มีให้ฉัน แต่ไม่ต้องทำอะไรอีกหรือไม่

คำตอบ:


231

ฉลาด

สำหรับรุ่นที่ทันสมัยaptมีสวิตช์เฉพาะสำหรับสิ่งนี้:

apt list --upgradable

apt-get

สำหรับapt-getคำสั่งเก่า-uสวิตช์จะแสดงรายการแพ็กเกจที่สามารถอัพเกรดได้:

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

จากapt-getหน้าคน :

-u
-
 แสดงการอัพเกรดแพคเกจที่แสดง; พิมพ์รายการแพ็คเกจทั้งหมดที่จะอัพเกรด รายการการกำหนดค่า: APT :: รับ :: แสดงการอัปเกรด
- สมมติว่าไม่มี  อัตโนมัติ "ไม่" เพื่อแจ้งทั้งหมด <== เพื่อป้องกันไม่ให้มันเริ่มติดตั้ง

2
ฉันหวังว่าสิ่งนี้สามารถทำได้โดยไม่ต้องรูท
ThorSummoner

19
หากคุณพิมพ์ "Y" แล้วกด Enter คำสั่งนี้จะติดตั้งการอัปเดต แน่นอนผมอยากจะแนะนำให้เพิ่ม "-s" มิฉะนั้นคำตอบนี้เป็นความเข้าใจผิด
Murmel

5
นี่เป็นคำตอบที่ผิดมากเพราะ (ไม่มีตัวเลือกเพิ่มเติม) คำสั่งรออินพุตและหากผู้ใช้ป้อนอินพุตผิดแพ็คเกจจะถูกติดตั้งซึ่งแก้ไขระบบซึ่งไม่ใช่สิ่งที่ OP ต้องการ (เกิดขึ้นในระบบของฉัน)
Daniel Alder

และ btw: -uเป็นตัวเลือกเริ่มต้นของapt-get
Daniel Alder

1
@ThorSummoner '-s' จะทำสิ่งที่คุณต้องการและทำงานโดยไม่ต้องรูท
nevelis

67
apt-get --just-print upgrade

ไม่ได้อ่านว่าง่ายด้านล่างเป็น perl หนึ่งซับในการแยกวิเคราะห์ 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"}'

สิ่งนี้ควรแสดงผลลัพธ์เช่น:

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

หวังว่ามันจะช่วยคนอื่นได้


1
เพียงแค่หัวเราะ: apt-get -s upgrade | awk -F '[] [()] +' '/ ^ ตัวอย่าง / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
tink

8
นอกจากนี้ยังอาจจะมากมีความสุขมากขึ้นมองการใช้งานถ้าcolumnเช่นนี้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
@ Antonton ดูดีมาก!
กรงขัง

1
ฉันกลัวรหัส Perl นี้จะแฮ็คเครื่องของฉัน ... ;)
Chris

33

ตัวเลือกอื่นแรงบันดาลใจจาก enzotib:

aptitude search '~U' | wc -l

คำสั่งนี้จะใช้ความสามารถในการแสดงผลแพ็กเกจใหม่แล้ว wc เพื่อนับจำนวนบรรทัด

บน sidenote ฉันพบว่าโซลูชันของ enzotib ที่ไม่มีเครื่องหมายคำพูดเดี่ยว ๆ รอบ ๆ ~ U ไม่ได้ผลสำหรับฉัน (เสียงดังเสียงฮืด ๆ , ZSH, ความถนัด 0.6.8.2)

อัปเดต:

ด้วย apt ใหม่ที่คุณสามารถทำได้:

apt list --upgradable

ขอบคุณสำหรับสิ่งนี้คำสั่งรายการ apt คือสิ่งที่ฉันต้องการ
dvorak

Nice ด้วยวิธีนี้คือคุณไม่จำเป็นต้องใช้ sudo / root
Gunni

25

วิธีที่ง่ายที่สุดคือ:

apt list --upgradable

ไม่ทำงานบนสะระแหน่
ychaouche

1
เป็นเรื่องน่าละอายที่จะไม่ส่งคืนรหัสทางออกที่แตกต่างกันขึ้นอยู่กับว่ามีการอัพเกรดหรือไม่ คงจะดีที่สามารถใช้สิ่งนี้ในสคริปต์
Dale Anderson

18

คุณสามารถเรียกใช้

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

หรือไม่มีเอกสาร

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

วิธีอื่นโดยใช้การapt-getจำลอง:

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

1
คำสั่งความถนัดนี้ใช้งานได้ดีสำหรับฉันและไม่ต้องการราก
JamesCW

apt-get -s dist-upgrade ใช้งานได้ดีเช่นกันและมีเอาต์พุตเหมือนกันเมื่อคุณส่งไปยังผู้ที่ไม่ดี
ychaouche

ขอขอบคุณ! สิ่งนี้ได้ออกมาจากนรกที่ค่อนข้างพึ่งพา ได้พยายามที่จะแต่ไม่สูญเสียแพคเกจที่จำเป็นบางอย่างเพื่อที่จะใช้ dist-upgrade ทำเคล็ดลับ! aptitudeaptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
Jayen

11

ดูแพ็คเกจ "apticron":

apticron - เครื่องมือง่ายๆในการส่งจดหมายเกี่ยวกับการอัปเดตแพ็กเกจที่ค้างอยู่

Apticron เป็นสคริปต์ง่าย ๆ ที่ส่งอีเมลรายวันเกี่ยวกับการอัปเดตแพคเกจที่รอดำเนินการเช่นการอัปเดตความปลอดภัยการจัดการแพ็กเกจที่ถูกระงับทั้งสองอย่างโดย dselect และความถนัด

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


ลิงก์ของคุณเสีย ...
Alexis Wilke

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

จะแสดงรายการการปรับปรุงที่มีอยู่โดยไม่ต้องติดตั้งจริง

คำสั่งแรกอัพเดตไฟล์ดัชนีแพ็กเกจก่อนการจำลอง (ดังนั้น -s) จะถูกอัพเกรด "-s" จะทำการอัพเกรดแบบจำลองซึ่งแสดงแพ็คเก็ตที่จะติดตั้ง แต่จะไม่ติดตั้งอะไรเลย

ในทางตรงกันข้าม "-u" แทน "-s" จะติดตั้งจริงหลังจากการยืนยัน


2
ตัวเลือกการจำลองสามารถถูกเรียกใช้ด้วยใด ๆ-s, --simulate, --just-print, --dry-run, --recon, --no-act, recon และ dry-run เป็นรายการโปรดส่วนตัวของฉัน
ThorSummoner

9

ฉันต้องการข้อมูลเวอร์ชั่นเต็มเกี่ยวกับการอัพเกรดที่เป็นไปได้ดังนั้นฉันจึงใช้คำตอบของ jasonwryan:

apt-get -V -u upgrade

มันง่ายและ IMO จัดรูปแบบผลลัพธ์ที่สมเหตุสมผล


3

เพียงกรองผลลัพธ์ของ

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

เพื่อให้มีเพียงข้อมูลที่ต้องการในบันทึกของคุณ

ส่วนใหญ่แล้วคุณจะต้องมีส่วนที่สวยงามหลังจากบรรทัด

...

แพ็คเกจต่อไปนี้จะได้รับการอัพเกรด:

...

ที่มีช่องว่างน้อยในการเริ่มต้น


สวัสดีและยินดีต้อนรับสู่เว็บไซต์ คำตอบของคุณนั้นเป็นรูปแบบใหม่ของคำตอบเดิม ๆ ดังนั้นอย่าเพิ่มอะไรใหม่ ตัวอย่างเช่นคุณสามารถปรับปรุงได้โดยอธิบายวิธีกรองเอาท์พุทเพิ่มคำอธิบายว่าสวิตช์ต่าง ๆ ทำอะไรได้บ้าง
terdon

2

Jet อีกซับใน, แรงบันดาลใจจากคำตอบนี้ :

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;

ผลลัพธ์มีลักษณะดังนี้ (มีสี):

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

หากคุณไม่ต้องการคำอธิบายสั้น ๆ ให้ใช้อันนี้:

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

เอาท์พุท:

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)

สายการบินหนึ่งที่ยอดเยี่ยมยกเว้นมันจะไม่ส่งออกคำอธิบายของแพคเกจบางอย่าง
ychaouche

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

เป็นวิธีที่ง่ายที่สุดสำหรับอีเมล cron ไม่มีการวนซ้ำของผู้ใช้และหากไม่มีการอัพเดตจะไม่มีเอาต์พุต


1

หลังจากเขียนคำเตือนไปยังคำตอบ @ jasonwryan ของฉันต้องการให้วิธีการแก้ปัญหาของตัวเอง:

apt-get dist-upgrade --assume-no

น่าเสียดายที่อันนี้ใช้ไม่ได้กับ debian wheezy และฉันต้องตรวจสอบคอนเทนเนอร์ lxc ซึ่งยังไม่ได้อัพเกรด แบบฟอร์มนี้จะใช้งานได้เสมอ:

apt-get dist-upgrade </dev/null

ในที่สุดฉันก็ต้องการที่จะฟอร์แมตผลลัพธ์ ฉันเลือกที่จะเปลี่ยนการโทรอีกครั้ง (โดยใช้--dry-runแต่ไม่สนใจเอาต์พุตเพิ่มเติมทั้งหมด) เพราะรู้สึกปลอดภัยมากขึ้น:

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

ผลตอบแทน:

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

1

apt-check อาจเป็นวิธีการเขียนสคริปต์ที่มีประสิทธิภาพที่สุด

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

การปรับเปลี่ยนขนาดเล็กมากแสดงเฉพาะการปรับปรุงความปลอดภัย

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

0

เป็นรูปแบบที่ฉันใช้ต่อไปนี้:

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

ติดไว้ในสคริปต์ชื่อapt-updatesและจากนั้นคุณสามารถโทรapt-updatesเพื่อรับรายการอัพเดตทั้งหมดโดยไม่คำนึงถึงผู้ใช้

คุณยังคงต้องโทรapt-get updateด้วยสิทธิ์พิเศษ


เอาต์พุตจะแสดงเฉพาะชื่อแพ็คเกจ (คอลัมน์แรก) คอลัมน์ที่สองพิมพ์ "=" เสมอและคอลัมน์ที่สามจะว่างเสมอ ฉันอยู่ในโรงกษาปณ์
ychaouche


0

ฉันชอบที่จะใช้สิ่งนี้:

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

คุณได้รับผลลัพธ์เช่นนี้:

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

หากมีการปรับปรุงและไม่มีถ้าไม่มี วิธีนี้คุณสามารถจับคู่กับโซลูชันการตรวจสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.