Mengapa apt-get menginstal Virtual Box alih-alih g ++?

12

Saya baru saja menemukan sesuatu yang saya heran mungkin bisa menjadi masalah keamanan utama dengan terminal Linux. Saya mencoba menginstal g ++ 5.0. Saya seorang pemula untuk Linux, jadi saya baru saja mengetik sudo apt-get install g++ 5.0. Alih-alih hanya mengembalikan kesalahan atau sesuatu, itu menginstal Kotak Virtual!

Jika saya mencoba menginstal satu hal dari terminal dan menginstal sesuatu yang sama sekali berbeda, apakah itu berarti itu dapat terjadi pada hal lain, mungkin malware? Mengapa menginstal Virtual Box ketika saya mengetik sesuatu yang sama sekali berbeda?

heemayl
sumber
6
... AFAIK apt-getakan meminta konfirmasi dari pengguna, jadi Anda bisa memasukkan ndan menghindari menginstal VirtualBox ... Juga repositori Ubuntu diperiksa, jadi seharusnya tidak ada paket malware yang dapat Anda instal di tempat pertama. Jika Anda menambahkan PPA acak, ini mungkin terjadi tetapi itu karena Anda memberi tahu Ubuntu untuk menginstal aplikasi dari sumber yang tidak terpercaya.
Bakuriu
1
Fav'd (dan +1 tentu saja) karena pertanyaan ini benar-benar layak untuk itu . Ini menunjukkan efek buruk (tidak dapat dibalikkan) dari tidak peduli dengan tindakan Anda, dan merupakan motivasi bagi Anda untuk tidak melakukan kesalahan yang sama dan ceroboh.
EKons
12
a major security issue with the Linux terminalTidak, tenanglah. Ini hanya (jangan tersinggung!) Anda tidak membaca / mengetik dengan benar - tidak ada masalah dengan Linux apt-get,, atau salah satu dari banyak terminal berbeda yang tersedia.
underscore_d
2
@ ΈρικΚωνσταντόπουλος Apa "efek buruk yang tidak dapat diubah"? Menginstal program non-malware yang dapat Anda hapus dengan mudah?
Bakuriu
2
Tunggu hingga Anda menemukan "rm -rf directoryA / directoryB /" ( jangan coba-coba! ). Anda harus berhati-hati dengan apa yang Anda ketik dan tempel sebagai root.
pjc50

Jawaban:

29

Perintah

sudo apt-get install g++ 5.0 

menunjukkan Anda ingin menginstal dua paket: g++dan 5.0. (Nama paket tidak memiliki spasi, dan apt-get menerima beberapa nama paket, dipisahkan oleh spasi.)

Apa yang mungkin terjadi adalah menginstal g ++ seperti yang diminta, lalu menginstal semua paket (termasuk nomor versi) yang cocok dengan ekspresi reguler 5.0(karena tidak ada paket yang benar-benar bernama 5.0). (terima kasih @edwinksl!)

Untuk menghindari ini, pastikan Anda memiliki nama paket yang benar, tanpa spasi. Anda juga dapat menggunakan -sopsi untuk mensimulasikan tindakan apt-get sebelum melakukannya secara nyata:

sudo apt-get -s install g++ 5.0

akan menunjukkan kepada Anda tindakan yang akan dilakukan perintah , tanpa benar-benar menginstal apa pun. Jika terlihat OK, Anda dapat menghapus -suntuk melakukan instalasi.

Anda juga dapat mempertimbangkan untuk menggunakan manajer paket grafis yang lebih ramah-pemula, seperti synapticatau muon.

Nick Weinberg
sumber
4
5.0sedang digunakan sebagai regex, jadi aptmelakukan lebih dari sekadar mencocokkan string "5.0".
edwinksl
10
Untuk orang-orang yang tidak terbiasa regex, sebuah titik cocok dengan karakter tunggal mana pun. Dan karena kecocokan regex secara default terlihat di string, "5.0"berarti "nama apa pun yang berisi 5, diikuti 2 karakter kemudian dengan 0". Contoh "FooBar 2.510" atau "AcmeWidgets 5.0" ("setiap karakter tunggal" tidak termasuk titik literal)
MSalters
8

Perintah yang benar untuk menginstal g++versi 5.x adalah:

sudo apt-get install g++-5

Ini akan menginstal g++versi 5.3 pada xenial, yang merupakan default saat ini (jadi apt-get install g++instal juga, tetapi ini akan berubah di masa depan). Faktanya, tidak ada rilis publik 5.0 dari GCC. g++Rilis lain dikemas, misalnya g++-4.9atau g++-6, yang dapat diinstal dengan cara yang sama.

Jika Anda perlu menginstal rilis tertentu (yang sudah ada) g++yang tidak dikemas untuk sistem Anda, Anda harus membuatnya dari sumber .

Dmitry Grigoryev
sumber
2
Ini adalah poin yang bagus; sudo apt install g++5.0(tanpa ruang antara g++dan 5.0) masih akan gagal.
edwinksl
4

Mari kita jabarkan.

Pertama-tama, sedikit catatan tentang cara apt-get install(dan sebagian besar apt-getargumen lain juga) bekerja:

  • Anda dapat memasukkan beberapa nama paket:

    sudo apt-get install foobar spamegg 
    
  • Nama-nama paket sebenarnya adalah man 7 regexpola Ekspresi Reguler Diperpanjang (ERE) (Periksa ) sehingga nama paket foo.barberarti nama paket apa pun yang memiliki substring yang dimulai dengan foodan diakhiri dengan barkarakter tunggal antara foodan bar. Kemungkinan f.*rberarti setiap nama paket yang berisi substring yang memiliki fdan rdengan sejumlah karakter yaitu apa pun di antaranya. Untuk melakukan pencocokan seluruh nama paket, gunakan token awal dan akhir mis ^foo.bar$. Jika Anda ingin token Regex apa pun diperlakukan secara harfiah, maka Anda harus melarikan diri dari token dengan \misalnya untuk memperlakukan foo.barsecara harfiah, Anda perlu:

    sudo apt-get install 'foo\.bar'
    

    Di sini kutip tunggal adalah untuk mencegah interpretasi shell dari pola sebagai pola globbing, tidak perlu dalam kasus ini tetapi akan diperlukan misalnya untuk pola foo.*barjika Anda memiliki file di direktori saat ini bernama misalnya foo.bar.

  • Ada tangkapan pada pertimbangan nama paket. Jika ada paket yang cocok dengan polanya, polanya akan diperlakukan secara literal dan tidak ada interpretasi Regex yang akan dilakukan. Misalnya, untuk pola paket g++, itu akan cocok dengan paket g++secara harfiah terlepas dari token Regex +. Jika tidak ada paket bernama g++dalam repositori yang ditentukan, itu akan diperlakukan sebagai pola ERE.

Sekarang, Anda telah memberikan perintah:

sudo apt-get install g++ 5.0

Ini berarti:

  • Anda ingin menginstal dua pola paket yang disediakan yaitu g++dan5.0

  • g++cocok dengan paket meta literal g++seperti yang disebutkan di atas

  • Bagian yang tersisa 5.0,, memiliki token Regex, .yaitu setiap karakter tunggal. Jadi ini akan cocok dengan nama paket apa pun yang berisi 5<any_character>0. Jadi semua paket yang memiliki kecocokan telah dipilih untuk diinstal dan mungkin virtualbox-5.0juga telah dipilih dalam proses.

Agaknya Anda ingin menginstal g++versi 5, jadi melakukan hal berikut akan dilakukan ( sudah disebutkan dalam jawaban ini ); Paket meta g++-5,, akan merujuk pada paket minor dirilis g++versi 5 terbaru yang tersedia :

sudo apt-get install g++-5

Untuk mencari paket apa pun, dalam repositori yang dikonfigurasi, gunakan apt-cache(gunakan seperti ERE apt-get):

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

Jika Anda tidak ingin Regex-ify itu, gunakan lessuntuk menggulir ke bawah daftar yang agak besar:

apt-cache search g++ | less

Juga sebelum memasang apa pun yang Anda tidak yakin, jangan gunakan opsi -y( --assume-yes) dan ujilah terlebih dahulu dengan -s( --simulate/ --dry-run):

sudo apt-get install --dry-run foobar
heemayl
sumber
1
+1 Jawaban paling lengkap dan terorganisir. Mencoba pertandingan literal sebelum kembali menggunakan RE; penggunaan RE diperpanjang (sebagai lawan dari RE sederhana); kemampuan untuk apt-cache searchsemuanya penting untuk diperhatikan.
arielf