Acabo de encontrar algo que me pregunto podría ser un problema de seguridad importante con el terminal Linux. Estaba intentando instalar g ++ 5.0. Soy un novato en Linux, así que simplemente escribí sudo apt-get install g++ 5.0
. En lugar de simplemente devolver un error o algo, ¡ instaló Virtual Box!
Si trato de instalar una cosa desde el terminal e instala algo completamente diferente, ¿eso significa que podría sucederle a otra cosa, posiblemente malware? ¿Por qué instalaría Virtual Box cuando escribí algo completamente diferente?
apt-get
le pedirá confirmación al usuario, por lo que podría insertarn
y evitar instalar VirtualBox ... También se verifica el repositorio de Ubuntu, por lo que no debería haber ningún paquete de malware que pueda instalar en primer lugar. Si agrega PPA al azar, esto podría suceder, pero es porque le dijo a Ubuntu que instale aplicaciones de una fuente no confiable.a major security issue with the Linux terminal
No, cálmate. Esto fue simplemente (¡sin ofender!) Que no estaba leyendo / escribiendo correctamente, no hay ningún problema con Linuxapt-get
o cualquiera de los muchos terminales diferentes que están disponibles.Respuestas:
El comando
indica que desea instalar dos paquetes:
g++
y5.0
. (Los nombres de los paquetes no tienen espacios, y apt-get acepta varios nombres de paquetes, separados por espacios).Lo que probablemente sucedió es que instaló g ++ según lo solicitado, luego instaló todos los paquetes (incluidos los números de versión) que coinciden con la expresión regular
5.0
(ya que no hay un paquete realmente nombrado5.0
). (¡Gracias @edwinksl!)Para evitar esto, asegúrese de tener los nombres de paquete correctos, sin espacios. También puede usar la
-s
opción para simular una acción apt-get antes de hacerlo de verdad:le mostrará las acciones que el comando sería realizar, sin tener que instalar nada. Si se ve bien, puede eliminar el
-s
para realizar la instalación.También podría considerar usar un administrador de paquetes gráfico más amigable para los novatos, como
synaptic
omuon
.fuente
5.0
se está utilizando como una expresión regular, por lo queapt
está haciendo más que solo coincidir con la cadena "5.0".regex
, un punto coincide con cualquier carácter individual. Y dado que una coincidencia de expresiones regulares por defecto se ve en cualquier parte de una cadena,"5.0"
significa "cualquier nombre que contenga un 5, seguido de 2 caracteres más adelante por un 0". Ejemplos "FooBar 2.510" o "AcmeWidgets 5.0" ("cualquier carácter individual" incluye un punto literal)El comando correcto para instalar la
g++
versión 5.x es:Esto instalará la
g++
versión 5.3 en xenial, que es el valor predeterminado actual (porapt-get install g++
lo que también lo instala, pero esto cambiará en el futuro). De hecho, no hay una versión pública 5.0 de GCC. Otrasg++
versiones están empaquetadas, por ejemplo,g++-4.9
og++-6
, que se pueden instalar de la misma manera.Si alguna vez necesita instalar una versión específica (existente) de la
g++
cual no está empaquetada para su sistema, deberá compilarla desde las fuentes .fuente
sudo apt install g++5.0
(sin el espacio entreg++
y5.0
) todavía habría fallado.Vamos a desglosarlo.
En primer lugar, algunas notas sobre cómo funciona
apt-get install
(y la mayoría de los otrosapt-get
argumentos también):Puede ingresar múltiples nombres de paquetes:
Los nombres de paquetes son en realidad
man 7 regex
patrones de Expresión regular extendida (ERE) (Verificar ), por lo que un nombre de paquetefoo.bar
significa cualquier nombre de paquete que tenga una subcadena que comiencefoo
y terminebar
con cualquier carácter único entrefoo
ybar
. Probablef.*r
significa cualquier nombre de paquete que contenga una subcadena que tengaf
yr
con cualquier número de caracteres, es decir, cualquier cosa intermedia. Para hacer coincidir todo el nombre del paquete, use tokens de inicio y fin, por ejemplo^foo.bar$
. Si desea que cualquier ficha Regex sea tratada literalmente, entonces necesita escapar de la ficha con,\
por ejemplo, para tratarfoo.bar
literalmente, necesita:Aquí, la comilla simple es para evitar la interpretación de shell del patrón como un patrón global, no es necesario en este caso, pero sería necesario, por ejemplo, para el patrón
foo.*bar
si tiene un archivo en el directorio actual llamado egfoo.bar
.Hay una trampa en la consideración del nombre del paquete. Si hay algún paquete que coincida con el patrón, el patrón será tratado literalmente y no se realizará ninguna interpretación Regex. Por ejemplo, para un patrón de paquete
g++
, coincidirá con el paqueteg++
literalmente, independientemente del token Regex+
. Si no hubiera ningún paquete nombradog++
en los repositorios definidos, se tratará como un patrón ERE.Ahora, has dado el comando:
Esto significa:
Desea instalar dos paquetes de patrones proporcionados, a saber,
g++
y5.0
g++
coincide con el metapaquete literalg++
como se mencionó anteriormenteLa porción restante
5.0
, tiene una ficha Regex,.
es decir , cualquier carácter individual. Entonces esto coincidirá con cualquier nombre de paquete que contenga5<any_character>0
. Por lo tanto, todos los paquetes que tienen la coincidencia se seleccionaron para su instalación y presumiblementevirtualbox-5.0
también se seleccionaron en el proceso.Presumiblemente desea instalar la
g++
versión5
, por lo que hacer lo siguiente haría ( ya mencionado en esta respuesta ); El metapaqueteg++-5
, se referirá al último paquete menor lanzado disponible de lag++
versión 5:Para buscar cualquier paquete, dentro de los repositorios configurados, use
apt-cache
(usa ERE comoapt-get
):Si no desea regexiarlo, use
less
para desplazarse hacia abajo en la lista más grande:Además, antes de instalar algo de lo que no esté seguro, no use la opción
-y
(--assume-yes
) y pruébela primero con-s
(--simulate
/--dry-run
):fuente
apt-cache search
todos son importantes para tener en cuenta.