Pourquoi apt-get a-t-il installé Virtual Box au lieu de g ++?

12

Je viens de tomber sur quelque chose qui, je pense, pourrait être un problème de sécurité majeur avec le terminal Linux. J'essayais d'installer g ++ 5.0. Je suis un débutant sous Linux, donc je viens de taper sudo apt-get install g++ 5.0. Au lieu de simplement renvoyer une erreur ou quelque chose, il a installé Virtual Box!

Si j'essaie d'installer une chose à partir du terminal et que j'installe quelque chose de complètement différent, cela signifie-t-il que cela pourrait arriver à autre chose, peut-être un malware? Pourquoi installerait-il Virtual Box quand je tapais quelque chose de complètement différent, de toute façon?

heemayl
la source
6
... AFAIK apt-getdemandera une confirmation à l'utilisateur, vous pouvez donc simplement insérer net éviter d'installer VirtualBox ... De plus, le référentiel d'Ubuntu est vérifié, donc il ne devrait pas y avoir de package de malware que vous pouvez installer en premier lieu. Si vous ajoutez des PPA aléatoires, cela peut se produire, mais c'est parce que vous avez dit à Ubuntu d'installer les applications à partir d'une source non fiable.
Bakuriu
1
Fav'd (et + 1'ed bien sûr) parce que cette question le mérite vraiment . Il montre les mauvais effets (irréversibles) de ne pas se soucier suffisamment de vos actions, et est une motivation pour vous de ne pas faire la même erreur imprudente.
EKons
12
a major security issue with the Linux terminalNon, calme-toi. C'était juste (sans infraction!) Que vous ne lisiez / ne tapiez pas correctement - pas de problème avec Linux apt-get, ou l'un des nombreux terminaux différents disponibles.
underscore_d
2
@ ΈρικΚωνσταντόπουλος Quels sont les "mauvais effets irréversibles"? Vous installez un programme non malveillant que vous pouvez désinstaller aussi facilement?
Bakuriu
2
Attendez de découvrir "rm -rf directoryA / directoryB /" ( ne l'essayez pas! ). Vous devez faire attention à ce que vous tapez et collez en tant que root.
pjc50

Réponses:

29

La commande

sudo apt-get install g++ 5.0 

indique que vous souhaitez installer deux packages: g++et 5.0. (Les noms de packages n'ont pas d'espaces, et apt-get accepte plusieurs noms de packages, séparés par des espaces.)

Ce qui s'est probablement passé, c'est qu'il a installé g ++ comme demandé, puis installé tous les packages (y compris les numéros de version) qui correspondent à l'expression régulière 5.0(car il n'y a pas de package réellement nommé 5.0). (merci @edwinksl!)

Pour éviter cela, assurez-vous d'avoir les noms de package corrects, sans espaces. Vous pouvez également utiliser l' -soption pour simuler une action apt-get avant de la faire pour de vrai:

sudo apt-get -s install g++ 5.0

vous montrer les actions que la commande serait exécuter, sans installer quoi que ce soit. S'il semble correct, vous pouvez supprimer le -spour effectuer l'installation.

Vous pouvez également envisager d'utiliser un gestionnaire de packages graphiques plus convivial pour les débutants, comme synapticou muon.

Nick Weinberg
la source
4
5.0est utilisé comme expression régulière, donc aptfait plus que simplement faire correspondre la chaîne "5.0".
edwinksl
10
Pour les personnes qui ne sont pas familières regex, un point correspond à n'importe quel caractère. Et comme une correspondance regex par défaut apparaît n'importe où dans une chaîne, "5.0"signifie "tout nom qui contient un 5, suivi de 2 caractères plus tard par un 0". Exemples «FooBar 2.510» ou «AcmeWidgets 5.0» («tout caractère unique» inclut un point littéral)
MSalters
8

La commande correcte pour installer la g++version 5.x est:

sudo apt-get install g++-5

Cela installera la g++version 5.3 sur xenial, qui est la valeur par défaut actuelle (l' apt-get install g++installe donc également, mais cela changera à l'avenir). En fait, il n'y a pas de version publique 5.0 de GCC. D'autres g++versions sont packagées, par exemple g++-4.9ou g++-6, qui peuvent être installées de la même manière.

Si vous avez besoin d'installer une version spécifique (existante) g++qui n'est pas packagée pour votre système, vous devrez la construire à partir de sources .

Dmitry Grigoryev
la source
2
C'est un bon point; sudo apt install g++5.0(sans l'espace entre g++et 5.0) aurait encore échoué.
edwinksl
4

Décomposons-le.

Tout d'abord, quelques notes sur le fonctionnement apt-get install(et la plupart des autres apt-getarguments également):

  • Vous pouvez saisir plusieurs noms de packages:

    sudo apt-get install foobar spamegg 
    
  • Les noms de package sont en fait des man 7 regexmodèles d' expression régulière étendue (ERE) (vérification ), de sorte qu'un nom de package foo.barsignifie tout nom de package dont la sous-chaîne commence fooet se termine barpar un caractère unique entre fooet bar. Probablement f.*rsignifie tout nom de package qui contient une sous-chaîne contenant fet ravec un nombre quelconque de caractères, c'est-à-dire quelque chose entre les deux. Pour faire correspondre le nom du paquet entier, utilisez les jetons de début et de fin, par exemple ^foo.bar$. Si vous voulez qu'un jeton Regex soit traité littéralement, vous devez échapper au jeton avec, \par exemple, pour le traitement foo.barlittéral, vous avez besoin de:

    sudo apt-get install 'foo\.bar'
    

    Ici, le guillemet simple est d'empêcher l'interprétation shell du modèle comme un modèle globbing, pas nécessaire dans ce cas mais serait nécessaire par exemple pour le modèle foo.*barsi vous avez un fichier dans le répertoire courant nommé eg foo.bar.

  • Il y a un hic sur la considération du nom du package. S'il existe un package correspondant au modèle, le modèle sera traité littéralement et aucune interprétation Regex ne sera effectuée. Par exemple, pour un modèle de package g++, il correspondra g++littéralement au package indépendamment du jeton Regex +. S'il n'y avait aucun package nommé g++dans les référentiels définis, il sera traité comme un modèle ERE.

Maintenant, vous avez donné la commande:

sudo apt-get install g++ 5.0

Ça signifie:

  • Vous souhaitez installer deux packages fournis de modèles à savoir g++et5.0

  • g++correspond au méta-package littéral g++comme mentionné ci-dessus

  • La partie restante 5.0,, a un jeton Regex, .c'est-à - dire n'importe quel caractère unique. Donc, cela correspondra à tout nom de package qui contient 5<any_character>0. Ainsi, tous les packages qui ont la correspondance ont été sélectionnés pour être installés et vraisemblablement virtualbox-5.0également sélectionnés dans le processus.

Vraisemblablement, vous voulez installer la g++version 5, donc faire ce qui suit ferait ( déjà mentionné dans cette réponse ); Le méta-package g++-5fera référence au dernier package mineur disponible de la g++version 5:

sudo apt-get install g++-5

Pour rechercher des packages, dans les référentiels configurés, utilisez apt-cache(utilise ERE comme apt-get):

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

Si vous ne voulez pas le regex-ify, utilisez lesspour faire défiler la liste un peu plus grande:

apt-cache search g++ | less

Avant d'installer quoi que ce soit dont vous n'êtes pas sûr, n'utilisez pas l' option -y( --assume-yes) et testez-la d'abord avec -s( --simulate/ --dry-run):

sudo apt-get install --dry-run foobar
heemayl
la source
1
+1 Réponse la plus complète et organisée. Essayer des correspondances littérales avant de se replier sur les RE; l'utilisation d'ER étendus (par opposition aux ER simples); il apt-cache searchest important d'être conscient de la capacité de.
arielf