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?
apt-get
demandera une confirmation à l'utilisateur, vous pouvez donc simplement insérern
et é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.a major security issue with the Linux terminal
Non, calme-toi. C'était juste (sans infraction!) Que vous ne lisiez / ne tapiez pas correctement - pas de problème avec Linuxapt-get
, ou l'un des nombreux terminaux différents disponibles.Réponses:
La commande
indique que vous souhaitez installer deux packages:
g++
et5.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'
-s
option pour simuler une action apt-get avant de la faire pour de vrai:vous montrer les actions que la commande serait exécuter, sans installer quoi que ce soit. S'il semble correct, vous pouvez supprimer le
-s
pour effectuer l'installation.Vous pouvez également envisager d'utiliser un gestionnaire de packages graphiques plus convivial pour les débutants, comme
synaptic
oumuon
.la source
5.0
est utilisé comme expression régulière, doncapt
fait plus que simplement faire correspondre la chaîne "5.0".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)La commande correcte pour installer la
g++
version 5.x est: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'autresg++
versions sont packagées, par exempleg++-4.9
oug++-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 .la source
sudo apt install g++5.0
(sans l'espace entreg++
et5.0
) aurait encore échoué.Décomposons-le.
Tout d'abord, quelques notes sur le fonctionnement
apt-get install
(et la plupart des autresapt-get
arguments également):Vous pouvez saisir plusieurs noms de packages:
Les noms de package sont en fait des
man 7 regex
modèles d' expression régulière étendue (ERE) (vérification ), de sorte qu'un nom de packagefoo.bar
signifie tout nom de package dont la sous-chaîne commencefoo
et se terminebar
par un caractère unique entrefoo
etbar
. Probablementf.*r
signifie tout nom de package qui contient une sous-chaîne contenantf
etr
avec 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 traitementfoo.bar
littéral, vous avez besoin de: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.*bar
si vous avez un fichier dans le répertoire courant nommé egfoo.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 correspondrag++
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:
Ça signifie:
Vous souhaitez installer deux packages fournis de modèles à savoir
g++
et5.0
g++
correspond au méta-package littéralg++
comme mentionné ci-dessusLa 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 contient5<any_character>0
. Ainsi, tous les packages qui ont la correspondance ont été sélectionnés pour être installés et vraisemblablementvirtualbox-5.0
également sélectionnés dans le processus.Vraisemblablement, vous voulez installer la
g++
version5
, donc faire ce qui suit ferait ( déjà mentionné dans cette réponse ); Le méta-packageg++-5
fera référence au dernier package mineur disponible de lag++
version 5:Pour rechercher des packages, dans les référentiels configurés, utilisez
apt-cache
(utilise ERE commeapt-get
):Si vous ne voulez pas le regex-ify, utilisez
less
pour faire défiler la liste un peu plus grande: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
):la source
apt-cache search
est important d'être conscient de la capacité de.