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?
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
.
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 .
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