ทำไม apt-get install Virtual Box แทน g ++


12

ฉันเพิ่งเจอสิ่งที่ฉันสงสัยอาจเป็นปัญหาด้านความปลอดภัยที่สำคัญกับ terminal Linux ฉันพยายามติดตั้ง g ++ 5.0 sudo apt-get install g++ 5.0ผมมือใหม่ลินุกซ์ดังนั้นฉันเพิ่งพิมพ์ แทนที่จะเพียงแค่ส่งคืนข้อผิดพลาดหรือบางสิ่งมันก็ติดตั้ง Virtual Box!

หากฉันพยายามติดตั้งสิ่งหนึ่งจากเครื่องเทอร์มินัลและติดตั้งสิ่งที่แตกต่างอย่างสิ้นเชิงนั่นหมายความว่ามันอาจเกิดขึ้นกับสิ่งอื่นมัลแวร์หรือไม่ ทำไมจะต้องติดตั้ง Virtual Box เมื่อฉันพิมพ์บางอย่างที่แตกต่างออกไปโดยสิ้นเชิง?


6
... AFAIK apt-getจะขอคำยืนยันจากผู้ใช้ดังนั้นคุณสามารถแทรกnและหลีกเลี่ยงการติดตั้ง VirtualBox ... นอกจากนี้ยังมีการตรวจสอบที่เก็บของ Ubuntu ดังนั้นจึงไม่มีแพ็คเกจมัลแวร์ใด ๆ ที่คุณสามารถติดตั้งได้ตั้งแต่แรก หากคุณเพิ่ม PPA แบบสุ่มสิ่งนี้อาจเกิดขึ้น แต่นั่นเป็นเพราะคุณบอกให้ Ubuntu ติดตั้งแอปพลิเคชันจากแหล่งที่ไม่น่าเชื่อถือ
Bakuriu

1
Fav'd (และ +1 แน่นอน) เพราะคำถามนี้จริงๆสมควรได้รับมัน มันแสดงให้เห็นถึงผลกระทบที่ไม่ดี (กลับไม่ได้) ที่ไม่ใส่ใจเพียงพอต่อการกระทำของคุณและเป็นแรงบันดาลใจสำหรับคุณที่จะไม่ทำผิดพลาดแบบเดียวกันและประมาท
EKons

12
a major security issue with the Linux terminalไม่ใจเย็น ๆ นี่เป็นเพียง (ไม่มีความผิด!) คุณไม่ได้อ่าน / พิมพ์อย่างถูกต้อง - ไม่มีปัญหาใด ๆ กับ Linux apt-get, หรือเทอร์มินัลต่าง ๆ มากมายที่มีให้
underscore_d

2
@ ΈρικΚωνσταντόπουλοςอะไรคือ "ผลกระทบที่ไม่สามารถย้อนกลับได้" คืออะไร? ติดตั้งโปรแกรมที่ไม่ใช่มัลแวร์ที่คุณสามารถถอนการติดตั้งได้อย่างง่ายดาย?
Bakuriu

2
รอจนกว่าคุณจะค้นพบ "rm -rf directoryA / directoryB /" ( อย่าลอง! ) คุณต้องระวังสิ่งที่คุณพิมพ์และวางในฐานะรูท
pjc50

คำตอบ:


29

คำสั่ง

sudo apt-get install g++ 5.0 

แสดงว่าคุณต้องการติดตั้งสองแพคเกจ: และg++ 5.0(ชื่อแพ็คเกจไม่มีช่องว่างและ apt-get ยอมรับชื่อแพคเกจหลายชื่อคั่นด้วยช่องว่าง)

สิ่งที่อาจเกิดขึ้นคือมันติดตั้ง g ++ ตามที่ร้องขอจากนั้นติดตั้งแพ็กเกจทั้งหมด (รวมถึงหมายเลขเวอร์ชัน) ที่ตรงกับนิพจน์ทั่วไป5.0(เนื่องจากไม่มีแพ็กเกจชื่อจริง5.0) (ขอบคุณ @edwinksl!)

เพื่อหลีกเลี่ยงปัญหานี้ให้แน่ใจว่าคุณมีชื่อแพคเกจที่ถูกต้องโดยไม่มีช่องว่าง คุณยังสามารถใช้-sตัวเลือกในการจำลองการกระทำ apt-get ก่อนที่จะทำจริง:

sudo apt-get -s install g++ 5.0

จะแสดงการกระทำที่คำสั่งจะดำเนินการโดยไม่ต้องติดตั้งอะไรเลย หากดูเหมือนว่าคุณสามารถลบ-sเพื่อทำการติดตั้ง

นอกจากนี้คุณยังสามารถพิจารณาใช้เป็นผู้จัดการแพคเกจเพิ่มเติมมือใหม่ง่ายกราฟิกเช่นหรือsynapticmuon


4
5.0กำลังถูกใช้เป็น regex ดังนั้นaptทำมากกว่าแค่จับคู่สตริง "5.0"
edwinksl

10
สำหรับคนที่ไม่คุ้นเคยregexจุดจะจับคู่กับอักขระเดี่ยวใด ๆ และเนื่องจากการจับคู่ regex โดยค่าเริ่มต้นจะดูที่ใดก็ได้ในสตริง"5.0"หมายความว่า "ชื่อใด ๆ ที่มี 5 ตามด้วย 2 ตัวอักษรในภายหลังด้วย 0" ตัวอย่าง "FooBar 2.510" หรือ "AcmeWidgets 5.0" ("อักขระใดก็ได้" จะมีจุดตัวอักษร)
MSalters

8

คำสั่งที่ถูกต้องในการติดตั้งg++เวอร์ชัน 5.x คือ:

sudo apt-get install g++-5

สิ่งนี้จะติดตั้งg++เวอร์ชั่น 5.3 บน xenial ซึ่งเป็นค่าเริ่มต้นปัจจุบัน (ดังนั้นควรapt-get install g++ติดตั้งเช่นกัน แต่จะเปลี่ยนในอนาคต) ในความเป็นจริงไม่มี GCC รุ่น 5.0 สาธารณะ รีลีสอื่น ๆg++เป็นแพ็คเกจเช่นg++-4.9หรือg++-6ซึ่งสามารถติดตั้งได้ในวิธีเดียวกัน

ถ้าคุณเคยต้องติดตั้งเฉพาะ (ที่มีอยู่) ปล่อยของg++ที่ไม่ได้บรรจุสำหรับระบบของคุณคุณจะต้องสร้างมันขึ้นมาจากแหล่งที่มา


2
นี่เป็นจุดที่ดี sudo apt install g++5.0(ไม่มีช่องว่างระหว่างg++และ5.0) จะยังคงล้มเหลว
edwinksl

4

มาทำลายมันกันเถอะ

ประการแรกโน้ตสองสามข้อเกี่ยวกับวิธีการapt-get install(และapt-getอาร์กิวเมนต์อื่น ๆ ส่วนใหญ่ด้วย):

  • คุณสามารถป้อนชื่อแพ็คเกจได้หลายชื่อ:

    sudo apt-get install foobar spamegg 
    
  • ชื่อแพคเกจมีการขยายจริงนิพจน์ปกติ (ERE) (ตรวจสอบman 7 regex) รูปแบบดังนั้นชื่อแพคเกจfoo.barหมายถึงชื่อแพคเกจใด ๆ ที่มีสตริงย่อยที่เริ่มต้นด้วยfooและจบลงด้วยbarกับอักขระตัวเดียวระหว่างและfoo barน่าจะf.*rหมายถึงชื่อแพคเกจใด ๆ ที่มีสตริงย่อยที่มีfและrมีจำนวนของอักขระใด ๆ เช่นสิ่งที่อยู่ในระหว่าง ^foo.bar$ที่จะทำตรงกับชื่อแพคเกจทั้งหมดใช้เริ่มต้นและจบราชสกุลเช่น หากคุณต้องการให้โทเค็น Regex ใด ๆ ได้รับการปฏิบัติอย่างแท้จริงคุณต้องหลีกเลี่ยงโทเค็นด้วย\เช่นสำหรับการปฏิบัติfoo.barตามตัวอักษรคุณต้อง:

    sudo apt-get install 'foo\.bar'
    

    ที่นี่ที่เดียว quoting คือการป้องกันไม่ให้เกิดการตีความเปลือกของรูปแบบเป็นรูปแบบ globbing ไม่จำเป็นในกรณีนี้ แต่จะต้องเช่นสำหรับรูปแบบถ้าคุณมีไฟล์ในเช่นไดเรกทอรีปัจจุบันชื่อfoo.*barfoo.bar

  • มีการพิจารณาเกี่ยวกับชื่อแพ็กเกจ หากมีแพ็คเกจใดที่ตรงกับรูปแบบรูปแบบจะได้รับการปฏิบัติอย่างแท้จริงและจะไม่มีการตีความ Regex ตัวอย่างเช่นสำหรับรูปแบบแพคเกจg++ก็จะตรงกับแพคเกจอย่างแท้จริงโดยไม่คำนึงถึงโทเค็นg++ Regex +หากไม่มีแพ็กเกจที่ระบุชื่อg++ในที่เก็บที่กำหนดไว้แพ็กเกจนั้นจะถูกใช้เป็นรูปแบบ ERE

ตอนนี้คุณได้รับคำสั่ง:

sudo apt-get install g++ 5.0

หมายความว่า:

  • คุณต้องการติดตั้งแพตเทิร์นสองรูปแบบที่มีให้คือg++และ5.0

  • g++ตรงกับแพคเกจตัวอักษรg++ตามที่กล่าวไว้ข้างต้น

  • ส่วนที่เหลือ5.0มีโทเค็น Regex .เช่นอักขระใด ๆ ก็ได้ ดังนั้นนี้จะตรงกับชื่อแพคเกจใด ๆ 5<any_character>0ที่มี ดังนั้นแพ็คเกจทั้งหมดที่มีการจับคู่ได้ถูกเลือกให้ติดตั้งและน่าจะvirtualbox-5.0ถูกเลือกในกระบวนการด้วย

สมมุติว่าคุณต้องการติดตั้งg++เวอร์ชั่น5ดังนั้นการทำสิ่งต่อไปนี้จะทำได้ ( ได้กล่าวถึงแล้วในคำตอบนี้ ); เมตาแพคเกจg++-5จะอ้างอิงถึงแพคเกจg++รุ่นย่อยที่ออกวางจำหน่ายล่าสุดของเวอร์ชัน 5:

sudo apt-get install g++-5

ในการค้นหาแพ็คเกจใด ๆ ภายในที่เก็บที่กำหนดค่าไว้ให้ใช้apt-cache(ใช้ ERE เช่นapt-get):

apt-cache search 'g\+\+-[0-9]+'

หากคุณไม่ต้องการ Regex-ify ให้ใช้lessเพื่อเลื่อนรายการที่ค่อนข้างใหญ่:

apt-cache search g++ | less

นอกจากนี้ก่อนติดตั้งสิ่งที่คุณไม่แน่ใจอย่าใช้ตัวเลือก-y( --assume-yes) และทดสอบก่อนด้วย-s( --simulate/ --dry-run):

sudo apt-get install --dry-run foobar

1
+1 คำตอบที่สมบูรณ์และเป็นระเบียบที่สุด ลองจับคู่ตามตัวอักษรก่อนที่จะถอยกลับใน REs; การใช้ RE แบบขยาย (ตรงข้ามกับ REs แบบธรรมดา); ความสามารถในการapt-cache searchเป็นสิ่งสำคัญที่ต้องระวัง
arielf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.