ฉันจะติดตั้งเพียงอัปเดตความปลอดภัยจากบรรทัดคำสั่งได้อย่างไร


333

sudo apt-get upgradeติดตั้งการอัปเดตทั้งหมดไม่ใช่แค่การอัปเดตความปลอดภัย ฉันรู้ว่าฉันสามารถใช้ Update Manager เพื่อเลือกอัปเดตความปลอดภัยที่สำคัญเท่านั้น แต่มีวิธีทำเช่นนี้จากบรรทัดคำสั่งหรือไม่


2
ฉันไม่คิดอย่างนั้น dist-upgrade นำทั้งระบบไปใช้กับรีลีสใหม่ ฉันกำลังพูดถึงการอัพเดทแบบวันต่อวันเหมือนกับที่คุณเห็นใน Update Manager
Michael Crenshaw

1
โอ้ฉันเห็นสิ่งที่คุณพูดตอนนี้ เฮ้ฉันเรียกใช้ apt-get update บ่อย ๆ ฉันพิมพ์มันโดยไม่คิด ขอบคุณสำหรับหัวขึ้น!
Michael Crenshaw

7
คุณต้องการ "apt-get dist-upgrade" ไม่ใช่ "apt-get upgrade" "dist-upgrade" ไม่ได้สำหรับรีลีสใหม่ (นั่นคือ "do-release-upgrade" คำสั่งแยกต่างหาก) การใช้ "dist-upgrade" หมายถึงมันจะจัดการการเปลี่ยนแปลงการพึ่งพาของแพ็คเกจใหม่ สิ่งนี้มีความสำคัญ
Kees Cook

3
dist-upgrade เป็นการดำเนินการปกติที่ดำเนินการโดย Update Manager GUI สำหรับแพ็คเกจเช่นเคอร์เนลที่มีlinux-image-genericแพ็คเกจขึ้นอยู่กับอิมเมจปัจจุบันเช่นlinux-image-3.x.y-zz-generic(แต่ละเวอร์ชันซึ่งเป็นชื่อแพ็กเกจแยกต่างหาก) การอัพเกรด dist (ซึ่งอนุญาตให้ติดตั้งแพ็กเกจใหม่เพื่อตอบสนองการพึ่งพา) จะทำการอัพเกรดนี้ ในขณะที่การอัพเกรดจะแสดงเคอร์เนลแพ็คเกจเป็นโฮลด์แบ็ก
chronitis

3
น่าแปลกใจที่ไม่มีapt-getคำตอบที่ดีสำหรับเรื่องนี้พิจารณาว่ามันมีการระบุไว้อย่างชัดเจนในแต่ละเซิร์ฟเวอร์อย่างไร
Karthik T

คำตอบ:


308

แพคเกจการปรับปรุงแบบอัตโนมัติให้การทำงานเพื่อติดตั้งการปรับปรุงความปลอดภัยโดยอัตโนมัติ

คุณสามารถใช้สิ่งนี้ แต่แทนที่จะกำหนดค่าชิ้นส่วนอัตโนมัติคุณสามารถเรียกมันได้ด้วยตนเอง:

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

หากคุณต้องการเรียกใช้อย่างเงียบ ๆ แทน:

sudo unattended-upgrade

หมายเหตุ: เมื่อคุณเรียกใช้การปรับรุ่นแบบอัตโนมัติคุณจะปล่อย "s" ออกจากจุดสิ้นสุด

สมมติว่าแพ็กเกจถูกติดตั้งตามค่าเริ่มต้นซึ่งอาจเป็น ถ้าไม่ทำแค่:

sudo apt-get install unattended-upgrades

/usr/share/doc/unattended-upgrades/README.mdดูเพิ่มเติม


สำหรับการปิดใช้งานการดำเนินการอัตโนมัติของunattended-upgradeคุณอาจต้องแก้ไข/etc/cron.daily/aptแต่ไม่แน่ใจว่าเป็น "ถูกต้อง" เมื่อต้องการทำเช่นนั้น
Jaime Hablutzel

หมายเหตุ: สำหรับเซิร์ฟเวอร์ Ubuntu 12.04.5 LTS unattended-upgradesจะไม่ได้รับการติดตั้งโดยค่าเริ่มต้น
Raptor

13
เนื่องจากคุณทำสิ่งนี้จากบรรทัดคำสั่งให้ใช้-vสำหรับข้อความข้อมูลหรือ-dข้อความดีบั๊ก /var/log/unattended-upgradesมิฉะนั้นยูทิลิตี้จะเงียบมากซึ่งในกรณีนี้คุณจะต้องตรวจสอบบันทึกใน คุณยังสามารถใช้--dry-runเพื่อจำลอง แต่ไม่สามารถอัพเกรดสิ่งใด ๆ สำหรับข้อมูลเพิ่มเติมและตัวเลือกอื่น ๆ ใช้--helpเพื่อรับข้อความช่วยเหลือ
ADTC

ฉันเรียนรู้บางอย่างเกี่ยวกับunattended-upgradesวันนี้ ขอบคุณ!
the0ther

"สำหรับการตรวจสอบว่ามันทำงานอย่างไร" เป็นเพียงการดีบักข้อความที่ไม่ใช่แบบโต้ตอบใช่มั้ย
กุมภ์อำนาจ

116

เคล็ดลับเล็กน้อยเกี่ยวกับวิธีจัดการการอัปเดต

สิ่งนี้ใช้ได้ทั้งกับ Debian และ Ubuntu แต่ทำตามคำแนะนำเฉพาะเพิ่มเติมสำหรับ Ubuntu ได้

  • แสดงการอัปเดตความปลอดภัยเท่านั้น:

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

    หรือ

    sudo unattended-upgrade --dry-run -d
    

    หรือ

    /usr/lib/update-notifier/apt-check -p
    
  • แสดงแพ็คเกจที่อัพเกรดได้ทั้งหมด

    apt-get -s dist-upgrade | grep "^Inst"
    
  • ติดตั้งการปรับปรุงความปลอดภัยเท่านั้น

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

หมายเหตุ:

  • บางครั้ง Ubuntu แสดงการอัปเดตความปลอดภัยราวกับว่ามาจากที่เก็บ $ release-updates ฉันก็บอกเช่นนี้เพราะนักพัฒนา Ubuntu ผลักดันการปรับปรุงความปลอดภัยไปยังที่เก็บ $ release-updates และเร่งความพร้อมของพวกเขา

    หากเป็นกรณีนี้คุณสามารถทำสิ่งต่อไปนี้เพื่อแสดงการปรับปรุงความปลอดภัยเท่านั้น:

    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'}
    
  • ตรวจสอบว่าบริการใดที่จำเป็นต้องเริ่มต้นใหม่หลังจากการอัพเกรดแพ็คเกจ คิดออกแพคเกจที่คุณจะอัพเกรดก่อนและกำหนดเวลาเริ่มต้นใหม่ / รีบูตของคุณ ปัญหาที่นี่คือยกเว้นว่าคุณจะเริ่มบริการใหม่ แต่ก็ยังอาจใช้ไลบรารีรุ่นเก่ากว่า (สาเหตุที่พบบ่อยที่สุด) ที่ถูกโหลดลงในหน่วยความจำก่อนที่คุณจะติดตั้งแพคเกจใหม่ซึ่งแก้ไขจุดอ่อนด้านความปลอดภัยหรืออะไรก็ตาม

    checkrestart -v
    

    อย่างไรก็ตามโปรดทราบว่าcheckrestartอาจแสดงรายการกระบวนการที่ไม่ควรเริ่มต้นใหม่ ตัวอย่างเช่นบริการ PostgreSQL อาจเก็บไว้ในการอ้างอิงหน่วยความจำของไฟล์ xlog ที่ถูกลบไปแล้วซึ่งไม่ใช่เหตุผลที่ถูกต้องในการเริ่มบริการ

    ดังนั้นอีกวิธีที่เชื่อถือได้มากกว่าการตรวจสอบสิ่งนี้โดยใช้อุปกรณ์มาตรฐานคือสคริปต์ทุบตีเล็ก ๆ น้อย ๆ ต่อไปนี้ที่ฉันขโมยมาจากhttps://locallost.net/?p=233

    มันตรวจสอบว่ากระบวนการที่กำลังทำงานอยู่บนระบบยังคงใช้ไลบรารี่ที่ถูกลบโดยอาศัยการเก็บสำเนาของสิ่งเหล่านั้นในหน่วยความจำที่ใช้งานอยู่

    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
ฉันสังเกตเห็นเฉพาะตอนนี้โพสต์นี้ มันแม่นยำมาก ขอบคุณมาก (+1)
Danduk82

'checkrestart' มาจากไหน ฉันหาไม่พบใน Ubuntu Trusty ฉันพบ "needrestart" ซึ่งดูเหมือนจะพอดีกับคำแนะนำของคุณหรือไม่
Ben XO

มันสามารถพบได้ในแพคเกจเดเบียนสารพัด: packages.debian.org/wheezy/debian-goodies นอกจากนี้ยังมีความต้องการเริ่มต้นใหม่ คุณสามารถค้นหาทั้งคู่ได้ที่ Xenial โดยเรียกใช้: $ apt-cache search checkrestart
ILIV

ฉันได้รับ "E: ไม่สามารถเปิดไฟล์ล็อค / var / lib / dpkg / lock - เปิด (13: ปฏิเสธสิทธิ์)" แม้ใช้ sudo นี่เป็นสิ่งที่เฉพาะเจาะจงสำหรับการอัปเดตหรือคำสั่งที่คุณให้ไว้หรือไม่
Nathan Hornby

เป็นไปได้มากว่ามันเกี่ยวกับการเลิกจ้าง dpkg ที่ไม่ถูกต้อง / ผิดปกติซึ่งทำให้ไฟล์ล็อคไม่ถูกต้อง ไม่เกิดขึ้นตามปกติจนกระทั่งเช่นการติดตั้งแพคเกจไม่เสร็จสมบูรณ์ (ดิสก์เต็ม ฯลฯ ) คุณอาจไม่สามารถเรียกใช้คำสั่ง apt-get และ dpkg อื่น ๆ ได้ไหม
ILIV

46

แทนที่/etc/apt/preferencesด้วยสิ่งต่อไปนี้:

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

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

ในตอนนี้apt-get upgradeจะเป็นการอัปเกรดความปลอดภัยทั้งหมดเท่านั้น

เหตุใด (และวิธี) การทำงาน: ไฟล์กำหนดค่าจะตรึงแพ็คเกจทั้งหมดจากการแจกจ่าย Ubuntu ไปยังลำดับความสำคัญ 50 ซึ่งจะทำให้พวกเขาพึงประสงค์น้อยกว่าแพ็คเกจที่ติดตั้งแล้ว ไฟล์ที่มาจากที่เก็บความปลอดภัยจะได้รับการจัดลำดับความสำคัญเริ่มต้น (500) เพื่อให้พวกเขาได้รับการพิจารณาสำหรับการติดตั้ง ซึ่งหมายความว่าเฉพาะแพ็คเกจที่ได้รับการพิจารณาว่าเป็นที่ต้องการมากกว่าแพ็คเกจที่ติดตั้งในปัจจุบันเท่านั้นคือการปรับปรุงความปลอดภัย ข้อมูลเพิ่มเติมเกี่ยวกับการปักหมุดในapt_preferences manpage

คุณสามารถโปรโมตการแจกจ่ายที่แน่นอนสำหรับการอัปเดตด้วย--target-releaseตัวเลือกที่ทำงานร่วมกับapt-getและaptitude(อย่างน้อย) ซึ่งจะช่วยให้คุณสามารถพินการเผยแพร่บางอย่างเพื่อให้พวกเขามีสิทธิ์อัปเกรด

หากคุณต้องการใช้สิ่งนี้สำหรับสคริปต์เท่านั้นและไม่ทำให้เป็นค่าเริ่มต้นสำหรับระบบคุณสามารถวางกฎไว้ในตำแหน่งอื่นและใช้สิ่งนี้แทน:

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

นี่จะทำให้มองหาไฟล์การตั้งค่าจากตำแหน่งที่ไม่ใช่ค่าเริ่มต้น

ไฟล์การกำหนดค่าตามความชอบที่ให้เป็นตัวอย่างไม่ได้ใช้กับที่เก็บของบุคคลที่สามหากคุณต้องการปักหมุดไฟล์เหล่านั้นด้วยคุณสามารถใช้apt-cache policyเพื่อกำหนดปุ่มที่จำเป็นสำหรับการปักได้อย่างง่ายดาย


ขอบคุณที่สละเวลาตอบอย่างถี่ถ้วน ฉันคิดว่าฉันเข้าใจว่ามันทำงานอย่างไร แต่เมื่อฉันสร้างไฟล์ / etc / apt / preferences และรัน apt-get upgrade มันต้องการอัพเกรดแพ็คเกจทั้งหมดไม่ใช่แค่การปรับปรุงความปลอดภัย การอัพเกรดรายการก่อนและหลังจะเหมือนกันทุกประการยกเว้น / etc / apt / preferences มันไม่ต้องการอัพเกรด Leafpad ซึ่งฉันสร้างจากแหล่งที่มาและติดตั้ง "ด้วยมือ" ด้วย dpkg ฉันแปลกมาก แต่อาจมีความหมายกับคุณ
Michael Crenshaw

1
คุณสามารถดูว่าเกิดอะไรขึ้นกับคำสั่งนโยบาย apt-cache apt-cache policy packagenameเลือกหนึ่งของแพคเกจที่ไม่ได้รับการแก้ไขการรักษาความปลอดภัยและการเรียกใช้ นี่จะแสดงรายการลำดับความสำคัญของเวอร์ชันต่างๆ คุณควรเห็นบรรทัดต่าง ๆ และลำดับความสำคัญต่างกัน หากไม่มีเส้นที่มีลำดับความสำคัญ 50 แสดงว่าการปักไม่มีผลกับแพ็คเกจที่เป็นปัญหาด้วยเหตุผลบางประการ
Ressu

1
ฉันทำตามคำตอบนี้ในอดีต วันนี้ฉันพบว่าเนื่องจากคำตอบนี้ 68 แพ็คเกจการปรับปรุงความปลอดภัยไม่ได้ติดตั้งบนเซิร์ฟเวอร์ของฉันและไม่ปรากฏว่าเป็นตัวเลือกการติดตั้งที่อาจเกิดขึ้น นี่ไม่ใช่คำตอบที่ดี!
โป๊ะ

12

สิ่งต่อไปนี้ได้รับการยืนยันใน Ubuntu 14.04 LTS

ใช้unattended-upgradeแพ็คเกจ

/etc/apt/apt.conf.d/50unattended-upgradesดูไฟล์ ควรมีส่วนที่ด้านบนนั่นคือ:

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

โปรดทราบว่ามีการกำหนดค่าให้อนุญาตการอัปเกรดแบบแพคเกจความปลอดภัยแบบอัตโนมัติโดยค่าเริ่มต้นเท่านั้น

แก้ไขไฟล์ที่/etc/apt/apt.conf.d/10periodicคล้ายกับ:

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

สิ่งนี้จะเรียกใช้การอัพเกรดความปลอดภัยอัตโนมัติโดยไม่ต้องใส่ข้อมูลวันละครั้ง

ตอนนี้ให้ทำงานด้วยตนเอง: sudo unattended-upgrade.

เพื่อทดสอบแบบแห้งโดยไม่ต้องทำอะไร: sudo unattended-upgrade --dry-run.

ที่มา: https://help.ubuntu.com/14.04/serverguide/automatic-updates.html


มีวิธีทำให้ตารางนี้เป็นรายเดือนหรือไม่?
mike.b93

1
@ mike.b93 ฉันเชื่อว่าการตั้งค่าAPT::Periodic::Unattended-Upgrade "30";จะทำเช่นนี้ - ทุก ๆ 30 วัน
vcardillo

5

แม้ว่ามันจะน่าเกลียดคุณสามารถปิดการใช้งานที่เก็บทั้งหมดนอกเหนือจากที่เก็บความปลอดภัยแล้วทำ:

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

ฉันไม่ได้ทำการทดสอบ แต่ในทางทฤษฎีแล้วมันจะค้นหาการปรับปรุงใน repo ด้านความปลอดภัยและใช้พวกเขาเท่านั้น ...


ใช่ว่าเป็นไปได้ ฉันจะดูมัน ฉันไม่เก่งเรื่อง BASH แต่ฉันอาจพยายามสร้างสคริปต์เพื่อทำมัน
Michael Crenshaw

ตกลงฉันปิดการใช้งานทั้งหมดยกเว้น repos ความปลอดภัยของ Ubuntu และเรียกใช้sudo apt-get update && sudo apt-get upgrade(ยกเลิกก่อนที่จะทำการอัพเกรดใด ๆ ) จากนั้นฉันเปิดใช้งาน repos ทั้งหมดของฉันใหม่รันsudo apt-get updateeและเปิด Update Manager แพ็คเกจที่ทำเครื่องหมายเป็นอัปเดตความปลอดภัยนั้นไม่ได้ถูกapt-get upgradeค้นพบอย่างแน่นอนแต่มันใกล้กันมากพอสำหรับฉัน ฉันยังหวังว่าฉันจะรู้อย่างแน่นอนว่าตัวจัดการอัปเดตทำได้อย่างไรและจะทำเช่นนั้นได้อย่างไรจากบรรทัดคำสั่ง แต่จะทำเช่นนี้ ขอบคุณ!
Michael Crenshaw

3
  • apt-get update: เพียงอ่านรายการในที่เก็บ - ตามรายการที่มีอยู่ จำเป็นต้องตรวจสอบว่ามีอะไรใหม่
  • apt-get upgrade: อัพเดตทั้งหมดสำหรับแพ็คเกจที่ติดตั้งโดยไม่มีโมดูลเคอร์เนล ไม่มีการอัพเดท
  • apt-get dist-upgrade: อัพเดตทั้งหมดสำหรับแพ็คเกจที่ติดตั้งมาพร้อมกับโมดูลเคอร์เนล ไม่มีการอัพเดท
  • apt-getด้วยพารามิเตอร์-s: ทดสอบเท่านั้นไม่มีการเปลี่ยนแปลงใด ๆ

0

ใน Debians ฉันใช้คำสั่งนี้เพื่อทำการปรับปรุงความปลอดภัยเท่านั้น:

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

0

ฉันไม่สามารถหาตัวเลือกได้ทั้ง apt-get หรือ aptitude อย่างไรก็ตามบางคนมีคำถามเดียวกันใน SuperUser คำตอบเดียวคือ:

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

ไม่มีการตอบกลับว่าทำงานอย่างไร


2
ปรากฏว่าวิธีที่อธิบายไว้ในหน้า wiki นั้นขึ้นอยู่กับการตั้งค่าอาร์กิวเมนต์ --target-release ของ aptitude ให้เป็น <release> - ความปลอดภัย เช่นเดียวกับ OP ของคำถามนั้นวิธีการนั้นจะติดตั้งการอัพเกรดทั้งหมดไม่ใช่แค่การอัพเกรดความปลอดภัย การอ่านหน้าคนฉลาด - เก่งและฉลาดฉันไม่คิดว่า - อาร์กิวเมนต์การปล่อยเป้าหมายมีวัตถุประสงค์เพื่อ จำกัด การอัพเกรดเพื่อความปลอดภัยเพียง แต่ฉันไม่แน่ใจว่ามันคืออะไรสำหรับ
Michael Crenshaw

0

นี่เป็นสคริปต์ที่ประสบความสำเร็จในหลายวิธี:

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