ฉันต้องการสคริปต์การรายงานที่ดำเนินการโดย cron เพื่อแจ้งให้ฉันทราบในกรณีที่มีการอัพเดตสำหรับแพ็คเกจของฉัน เป็นวิธีที่จะทำให้apt-get
รายการอัปเดตที่มีให้ฉัน แต่ไม่ต้องทำอะไรอีกหรือไม่
ฉันต้องการสคริปต์การรายงานที่ดำเนินการโดย cron เพื่อแจ้งให้ฉันทราบในกรณีที่มีการอัพเดตสำหรับแพ็คเกจของฉัน เป็นวิธีที่จะทำให้apt-get
รายการอัปเดตที่มีให้ฉัน แต่ไม่ต้องทำอะไรอีกหรือไม่
คำตอบ:
สำหรับรุ่นที่ทันสมัยapt
มีสวิตช์เฉพาะสำหรับสิ่งนี้:
apt list --upgradable
สำหรับapt-get
คำสั่งเก่า-u
สวิตช์จะแสดงรายการแพ็กเกจที่สามารถอัพเกรดได้:
# apt-get -u upgrade --assume-no
จากapt-get
หน้าคน :
-u
- แสดงการอัพเกรดแพคเกจที่แสดง; พิมพ์รายการแพ็คเกจทั้งหมดที่จะอัพเกรด รายการการกำหนดค่า: APT :: รับ :: แสดงการอัปเกรด
- สมมติว่าไม่มี อัตโนมัติ "ไม่" เพื่อแจ้งทั้งหมด <== เพื่อป้องกันไม่ให้มันเริ่มติดตั้ง
-u
เป็นตัวเลือกเริ่มต้นของapt-get
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
หวังว่ามันจะช่วยคนอื่นได้
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
ตัวเลือกอื่นแรงบันดาลใจจาก enzotib:
aptitude search '~U' | wc -l
คำสั่งนี้จะใช้ความสามารถในการแสดงผลแพ็กเกจใหม่แล้ว wc เพื่อนับจำนวนบรรทัด
บน sidenote ฉันพบว่าโซลูชันของ enzotib ที่ไม่มีเครื่องหมายคำพูดเดี่ยว ๆ รอบ ๆ ~ U ไม่ได้ผลสำหรับฉัน (เสียงดังเสียงฮืด ๆ , ZSH, ความถนัด 0.6.8.2)
อัปเดต:
ด้วย apt ใหม่ที่คุณสามารถทำได้:
apt list --upgradable
วิธีที่ง่ายที่สุดคือ:
apt list --upgradable
คุณสามารถเรียกใช้
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 }'
dist-upgrade
ทำเคล็ดลับ! aptitude
aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
ดูแพ็คเกจ "apticron":
apticron - เครื่องมือง่ายๆในการส่งจดหมายเกี่ยวกับการอัปเดตแพ็กเกจที่ค้างอยู่
Apticron เป็นสคริปต์ง่าย ๆ ที่ส่งอีเมลรายวันเกี่ยวกับการอัปเดตแพคเกจที่รอดำเนินการเช่นการอัปเดตความปลอดภัยการจัดการแพ็กเกจที่ถูกระงับทั้งสองอย่างโดย dselect และความถนัด
apt-get update && apt-get -s upgrade
จะแสดงรายการการปรับปรุงที่มีอยู่โดยไม่ต้องติดตั้งจริง
คำสั่งแรกอัพเดตไฟล์ดัชนีแพ็กเกจก่อนการจำลอง (ดังนั้น -s) จะถูกอัพเกรด "-s" จะทำการอัพเกรดแบบจำลองซึ่งแสดงแพ็คเก็ตที่จะติดตั้ง แต่จะไม่ติดตั้งอะไรเลย
ในทางตรงกันข้าม "-u" แทน "-s" จะติดตั้งจริงหลังจากการยืนยัน
-s, --simulate, --just-print, --dry-run, --recon, --no-act
, recon และ dry-run เป็นรายการโปรดส่วนตัวของฉัน
ฉันต้องการข้อมูลเวอร์ชั่นเต็มเกี่ยวกับการอัพเกรดที่เป็นไปได้ดังนั้นฉันจึงใช้คำตอบของ jasonwryan:
apt-get -V -u upgrade
มันง่ายและ IMO จัดรูปแบบผลลัพธ์ที่สมเหตุสมผล
เพียงกรองผลลัพธ์ของ
apt-get update && apt-get -s -V -u upgrade
เพื่อให้มีเพียงข้อมูลที่ต้องการในบันทึกของคุณ
ส่วนใหญ่แล้วคุณจะต้องมีส่วนที่สวยงามหลังจากบรรทัด
...
แพ็คเกจต่อไปนี้จะได้รับการอัพเกรด:
...
ที่มีช่องว่างน้อยในการเริ่มต้น
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)
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "
เป็นวิธีที่ง่ายที่สุดสำหรับอีเมล cron ไม่มีการวนซ้ำของผู้ใช้และหากไม่มีการอัพเดตจะไม่มีเอาต์พุต
หลังจากเขียนคำเตือนไปยังคำตอบ @ 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
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
เป็นรูปแบบที่ฉันใช้ต่อไปนี้:
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
ด้วยสิทธิ์พิเศษ
มีapt-show-versions
เครื่องมือ หากต้องการแสดงการอัปเดตที่มีให้เรียกใช้:
apt-show-versions -u
ฉันชอบที่จะใช้สิ่งนี้:
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])
หากมีการปรับปรุงและไม่มีถ้าไม่มี วิธีนี้คุณสามารถจับคู่กับโซลูชันการตรวจสอบ