¿Por qué apt-get instaló Virtual Box en lugar de g ++?

12

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?

heemayl
fuente
66
... AFAIK apt-getle pedirá confirmación al usuario, por lo que podría insertar ny 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.
Bakuriu
1
Fav'd (y + 1'ed, por supuesto) porque esta pregunta realmente lo merece . Muestra los efectos negativos (irreversibles) de no preocuparse lo suficiente por sus acciones, y es una motivación para que usted no cometa el mismo error descuidado.
EKons
12
a major security issue with the Linux terminalNo, cálmate. Esto fue simplemente (¡sin ofender!) Que no estaba leyendo / escribiendo correctamente, no hay ningún problema con Linux apt-geto cualquiera de los muchos terminales diferentes que están disponibles.
underscore_d
2
@ ΈρικΚωνσταντόπουλος ¿Cuáles son los "efectos negativos irreversibles"? ¿Instala un programa que no es de malware que puedes desinstalar tan fácilmente?
Bakuriu
2
Espere hasta que descubra "rm -rf directorioA / directorioB /" ( ¡no lo intente! ). Debes tener cuidado con lo que escribes y pegas como root.
pjc50

Respuestas:

29

El comando

sudo apt-get install g++ 5.0 

indica que desea instalar dos paquetes: g++y 5.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 nombrado 5.0). (¡Gracias @edwinksl!)

Para evitar esto, asegúrese de tener los nombres de paquete correctos, sin espacios. También puede usar la -sopción para simular una acción apt-get antes de hacerlo de verdad:

sudo apt-get -s install g++ 5.0

le mostrará las acciones que el comando sería realizar, sin tener que instalar nada. Si se ve bien, puede eliminar el -spara realizar la instalación.

También podría considerar usar un administrador de paquetes gráfico más amigable para los novatos, como synaptico muon.

Nick Weinberg
fuente
44
5.0se está utilizando como una expresión regular, por lo que aptestá haciendo más que solo coincidir con la cadena "5.0".
edwinksl
10
Para las personas que no están familiarizadas 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)
MSalters
8

El comando correcto para instalar la g++versión 5.x es:

sudo apt-get install g++-5

Esto instalará la g++versión 5.3 en xenial, que es el valor predeterminado actual (por apt-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. Otras g++versiones están empaquetadas, por ejemplo, g++-4.9o g++-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 .

Dmitry Grigoryev
fuente
2
Este es un buen punto; sudo apt install g++5.0(sin el espacio entre g++y 5.0) todavía habría fallado.
edwinksl
4

Vamos a desglosarlo.

En primer lugar, algunas notas sobre cómo funciona apt-get install(y la mayoría de los otros apt-getargumentos también):

  • Puede ingresar múltiples nombres de paquetes:

    sudo apt-get install foobar spamegg 
    
  • Los nombres de paquetes son en realidad man 7 regexpatrones de Expresión regular extendida (ERE) (Verificar ), por lo que un nombre de paquete foo.barsignifica cualquier nombre de paquete que tenga una subcadena que comience fooy termine barcon cualquier carácter único entre fooy bar. Probable f.*rsignifica cualquier nombre de paquete que contenga una subcadena que tenga fy rcon 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 tratar foo.barliteralmente, necesita:

    sudo apt-get install 'foo\.bar'
    

    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.*barsi tiene un archivo en el directorio actual llamado eg foo.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 paquete g++literalmente, independientemente del token Regex +. Si no hubiera ningún paquete nombrado g++en los repositorios definidos, se tratará como un patrón ERE.

Ahora, has dado el comando:

sudo apt-get install g++ 5.0

Esto significa:

  • Desea instalar dos paquetes de patrones proporcionados, a saber, g++y5.0

  • g++coincide con el metapaquete literal g++como se mencionó anteriormente

  • La porción restante 5.0, tiene una ficha Regex, .es decir , cualquier carácter individual. Entonces esto coincidirá con cualquier nombre de paquete que contenga 5<any_character>0. Por lo tanto, todos los paquetes que tienen la coincidencia se seleccionaron para su instalación y presumiblemente virtualbox-5.0también se seleccionaron en el proceso.

Presumiblemente desea instalar la g++versión 5, por lo que hacer lo siguiente haría ( ya mencionado en esta respuesta ); El metapaquete g++-5, se referirá al último paquete menor lanzado disponible de la g++versión 5:

sudo apt-get install g++-5

Para buscar cualquier paquete, dentro de los repositorios configurados, use apt-cache(usa ERE como apt-get):

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

Si no desea regexiarlo, use lesspara desplazarse hacia abajo en la lista más grande:

apt-cache search g++ | less

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):

sudo apt-get install --dry-run foobar
heemayl
fuente
1
+1 La respuesta más completa y organizada. Probar coincidencias literales antes de recurrir a los RE; el uso de RE extendida (en oposición a las RE simples); la capacidad de apt-cache searchtodos son importantes para tener en cuenta.
arielf