Perché apt-get ha installato Virtual Box invece di g ++?


12

Mi sono appena imbattuto in qualcosa che mi chiedo potrebbe essere un grosso problema di sicurezza con il terminale Linux. Stavo cercando di installare g ++ 5.0. Sono un principiante di Linux, quindi ho appena scritto sudo apt-get install g++ 5.0. Invece di restituire un errore o qualcosa del genere, ha installato Virtual Box!

Se provo a installare una cosa dal terminale e installa qualcosa di completamente diverso, significa che potrebbe succedere a qualcos'altro, forse malware? Perché dovrebbe installare Virtual Box quando ho digitato qualcosa di completamente diverso, comunque?


6
... AFAIK apt-getchiederà conferma all'utente, quindi puoi semplicemente inserire ned evitare l'installazione di VirtualBox ... Anche il repository di Ubuntu è controllato, quindi non ci dovrebbero essere pacchetti di malware che puoi installare in primo luogo. Se aggiungi PPA casuali questo potrebbe accadere, ma è perché hai detto a Ubuntu di installare applicazioni da una fonte non attendibile.
Bakuriu,

1
Fav'd (e + 1 ovviamente) perché questa domanda lo merita davvero . Mostra gli effetti (irreversibili) del non prendersi abbastanza cura delle proprie azioni, ed è una motivazione per voi di non fare lo stesso, sbadato errore.
EKons

12
a major security issue with the Linux terminalNo, calmati. Questo non è stato (senza offesa!) Che non hai letto / digitato correttamente - nessun problema con Linux apt-get, o con nessuno dei tanti terminali disponibili.
underscore_d

2
@ ΈρικΚωνσταντόπουλος Quali sono gli "effetti negativi irreversibili"? Installazione di un programma non malware che è possibile disinstallare facilmente?
Bakuriu,

2
Aspetta di scoprire "rm -rf directoryA / directoryB /" ( non provarlo! ). Devi stare attento a ciò che digiti e incolli come root.
pjc50,

Risposte:


29

Il comando

sudo apt-get install g++ 5.0 

indica che si desidera installare due pacchetti: g++e 5.0. (I nomi dei pacchetti non hanno spazi e apt-get accetta più nomi di pacchetti, separati da spazi.)

Ciò che probabilmente è accaduto è che ha installato g ++ come richiesto, quindi ha installato tutti i pacchetti (inclusi i numeri di versione) che corrispondono all'espressione regolare 5.0(poiché non esiste alcun pacchetto effettivamente denominato 5.0). (grazie @edwinksl!)

Per evitare ciò, assicurati di avere i nomi dei pacchetti corretti, senza spazi. Puoi anche usare l' -sopzione per simulare un'azione apt-get prima di farlo sul serio:

sudo apt-get -s install g++ 5.0

vi mostrerà le azioni che il comando avrebbe eseguire, senza realmente installare nulla. Se sembra OK, è possibile rimuovere -sper eseguire l'installazione.

Puoi anche prendere in considerazione l'utilizzo di un gestore di pacchetti grafico più intuitivo, come synaptico muon.


4
5.0viene usato come regex, quindi aptsta facendo molto di più che abbinare semplicemente la stringa "5.0".
edwinksl

10
Per le persone che non hanno familiarità regex, un punto corrisponde a ogni singolo personaggio. E poiché una corrispondenza regex per impostazione predefinita appare ovunque in una stringa, "5.0"significa "qualsiasi nome che contiene un 5, seguito da 2 caratteri in seguito da uno 0". Esempi "FooBar 2.510" o "AcmeWidgets 5.0" ("qualsiasi carattere singolo" include un punto letterale)
MSalters

8

Il comando corretto per installare la g++versione 5.x è:

sudo apt-get install g++-5

Questo installerà la g++versione 5.3 su xenial, che è l'attuale default (quindi lo apt-get install g++installa anche, ma questo cambierà in futuro). In effetti, non esiste una versione pubblica 5.0 di GCC. Altre g++versioni sono impacchettate, ad esempio g++-4.9o g++-6, che possono essere installate allo stesso modo.

Se hai mai bisogno di installare una versione specifica (esistente) di g++cui non è disponibile il pacchetto per il tuo sistema, dovrai crearla da fonti .


2
Questo è un buon punto; sudo apt install g++5.0(senza lo spazio tra g++e 5.0) sarebbe comunque fallito.
edwinksl,

4

Analizziamolo.

Prima di tutto, alcune note su come funziona apt-get install(e anche su molti altri apt-getargomenti):

  • È possibile inserire più nomi di pacchetto:

    sudo apt-get install foobar spamegg 
    
  • I nomi dei pacchetti sono in realtà man 7 regexmodelli ERE (Extended Regular Expression) (Verifica ), quindi un nome pacchetto foo.barindica qualsiasi nome pacchetto che ha una sottostringa che inizia con fooe termina barcon un singolo carattere tra fooe bar. Probabilmente f.*rsignifica qualsiasi nome di pacchetto che contiene una sottostringa che ha fe rcon un numero qualsiasi di caratteri, cioè qualsiasi cosa in mezzo. Per abbinare l'intero nome del pacchetto, utilizzare i token di inizio e fine, ad es ^foo.bar$. Se si desidera che un token Regex venga trattato alla lettera, è necessario sfuggire al token con \ad es. Per il trattamento alla foo.barlettera, è necessario:

    sudo apt-get install 'foo\.bar'
    

    Qui la singola citazione è per impedire l'interpretazione della shell del modello come modello globbing, non necessario in questo caso ma sarebbe necessario ad es. Per modello foo.*barse si dispone di un file nella directory corrente denominata es foo.bar.

  • C'è un problema nella considerazione del nome del pacchetto. Se è presente un pacchetto che corrisponde al modello, il modello verrà trattato alla lettera e non verrà eseguita alcuna interpretazione Regex. Ad esempio, per un modello di pacchetto g++, corrisponderà g++letteralmente al pacchetto indipendentemente dal token Regex +. Se non vi era alcun pacchetto nominato g++nei repository definiti, verrà trattato come un modello ERE.

Ora hai dato il comando:

sudo apt-get install g++ 5.0

Questo significa:

  • Si desidera installare due modelli forniti pacchetti vale a dire g++e5.0

  • g++corrisponde al meta-pacchetto letterale g++come menzionato sopra

  • La parte rimanente 5.0, ha un token Regex, .ovvero un singolo carattere. Quindi questo corrisponderà a qualsiasi nome di pacchetto che contiene 5<any_character>0. Quindi tutti i pacchetti che hanno la corrispondenza sono stati selezionati per essere installati e presumibilmente virtualbox-5.0sono stati selezionati anche nel processo.

Presumibilmente si desidera installare la g++versione 5, quindi fare quanto segue ( già menzionato in questa risposta ); Il meta-pacchetto, g++-5farà riferimento all'ultimo pacchetto rilasciato minore disponibile della g++versione 5:

sudo apt-get install g++-5

Per cercare eventuali pacchetti, all'interno dei repository configurati, utilizzare apt-cache(usa ERE come apt-get):

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

Se non si desidera Regex-ify, utilizzare lessper scorrere l'elenco piuttosto grande:

apt-cache search g++ | less

Inoltre, prima di installare qualsiasi cosa di cui non si è sicuri, non utilizzare l' opzione -y( --assume-yes) e provarla prima con -s( --simulate/ --dry-run):

sudo apt-get install --dry-run foobar

1
+1 Risposta più completa e organizzata. Provare partite letterali prima di ricadere su RE; l'uso di RE esteso (al contrario di semplici RE); la capacità di apt-cache searchessere tutti importanti di cui essere consapevoli.
arielf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.