web-dev-qa-db-fra.com

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

Je viens de trouver quelque chose que je me demande qui pourrait être un problème de sécurité majeur avec le terminal Linux. J'essayais d'installer g ++ 5.0. Je suis un novice en Linux, alors 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 quelque chose à partir du terminal et qu'il installe quelque chose de complètement différent, cela signifie-t-il que cela pourrait arriver à autre chose, peut-être un malware? Pourquoi installer Virtual Box quand je taperais quelque chose de complètement différent, de toute façon?

12
user572391

La commande

Sudo apt-get install g++ 5.0 

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

Ce qui est probablement arrivé, c’est qu’il a installé g ++ à la demande, puis tous les packages (y compris les numéros de version) qui correspondent à l’expression régulière 5.0 (puisqu’il n’existe aucun paquet nommé 5.0). (merci @edwinksl!)

Pour éviter cela, assurez-vous que vous avez les noms de paquet corrects, sans espaces. Vous pouvez également utiliser l'option -s pour simuler une action apt-get avant de le faire réellement:

Sudo apt-get -s install g++ 5.0

vous montrera les actions que la commande voudrait effectuer sans installer quoi que ce soit. Si le résultat est satisfaisant, vous pouvez supprimer le -s pour effectuer l’installation.

Vous pouvez également envisager d'utiliser un gestionnaire de paquets graphique plus convivial pour les débutants, tel que synaptic ou muon.

29
Nick Weinberg

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

Sudo apt-get install g++-5

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

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

8
Dmitry Grigoryev

Faisons le décomposer.

Tout d’abord, quelques remarques sur le fonctionnement de apt-get install (et de la plupart des autres arguments apt-get):

  • Vous pouvez entrer plusieurs noms de package:

    Sudo apt-get install foobar spamegg 
    
  • Les noms de package sont en fait des modèles d’expression régulière étendue (Check man 7 regex). Ainsi, un nom de package foo.bar désigne tout nom de package ayant une sous-chaîne commençant par foo et se terminant par bar par tout caractère unique compris entre foo et bar. Probablement f.*r signifie n'importe quel nom de paquet contenant une sous-chaîne qui a f et r avec n'importe quel nombre de caractères, c'est-à-dire rien entre les deux. Pour faire correspondre tout le nom du paquet, utilisez les jetons de début et de fin, par exemple. ^foo.bar$. Si vous voulez que chaque jeton Regex soit traité littéralement, vous devez lui échapper avec \ par ex. pour traiter littéralement foo.bar, vous avez besoin de:

    Sudo apt-get install 'foo\.bar'
    

    Ici, la citation unique vise à empêcher l’interprétation par Shell du motif en tant que motif globulant, ce qui n’est pas nécessaire dans ce cas mais serait nécessaire for pattern foo.*bar si vous avez un fichier dans le répertoire actuel nommé par exemple. foo.bar.

  • Il y a un piège dans la considération du nom du paquet. S'il y a un paquet correspondant au motif, celui-ci sera traité littéralement et aucune interprétation Regex ne sera faite. Par exemple, pour un modèle de paquetage g++, il correspondra au paquetage g++ indépendamment du jeton Regex +. S'il n'y avait pas de paquet nommé g++ dans les référentiels définis, il serait traité comme un modèle ERE.

Maintenant, vous avez donné la commande:

Sudo apt-get install g++ 5.0

Ça signifie:

  • Vous voulez installer deux modèles fournis par les packages, à savoir g++ et 5.0

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

  • La partie restante, 5.0, a un jeton Regex, ., c’est-à-dire tout caractère unique. Cela correspond donc à tout nom de package contenant 5<any_character>0. Ainsi, tous les packages qui ont la correspondance ont été sélectionnés pour être installés et probablement virtualbox-5.0 a également été sélectionné dans le processus.

Vraisemblablement, vous voulez installer g++ version 5, alors procédez comme suit: ( déjà mentionné dans cette réponse ); Le méta-package, g++-5, fera référence au dernier package mineur disponible publié de 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 répéter, utilisez less pour faire défiler la liste un peu plus longue:

apt-cache search g++ | less

De même, avant d’installer quoi que ce soit qui ne vous intéresse pas, 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
4
heemayl