Por que o apt-get instalou o Virtual Box em vez do g ++?

12

Acabei de encontrar algo que, imagino, poderia ser um grande problema de segurança no terminal Linux. Eu estava tentando instalar o g ++ 5.0. Sou iniciante no Linux, então apenas digitei sudo apt-get install g++ 5.0. Em vez de apenas retornar um erro ou algo assim, instalou o Virtual Box!

Se eu tentar instalar uma coisa do terminal e instalar algo completamente diferente, isso significa que pode acontecer com outra coisa, possivelmente com malware? Por que instalaria o Virtual Box quando eu digitei algo completamente diferente?

heemail
fonte
6
... O AFAIK apt-getsolicitará confirmação do usuário, para que você possa inserir ne evitar a instalação do VirtualBox ... O repositório do Ubuntu também é verificado, para que não haja nenhum pacote de malware que você possa instalar em primeiro lugar. Se você adicionar PPAs aleatórios, isso pode acontecer, mas é porque você disse ao Ubuntu para instalar aplicativos de uma fonte não confiável.
Bakuriu 1/08/16
1
Favorito (e marcou com +1, é claro) porque esta pergunta realmente merece . Mostra os efeitos negativos (irreversíveis) de não se importar o suficiente com suas ações e é uma motivação para você não fazer o mesmo erro descuidado.
EKons
12
a major security issue with the Linux terminalNão, acalme-se. Isso foi apenas (sem ofensa!) Que você não leu / digitou corretamente - nenhum problema com o Linux apt-getou qualquer um dos muitos terminais diferentes disponíveis.
Underscore_d
2
@ ΈρικΚωνσταντόπουλος Quais são os "efeitos negativos irreversíveis"? Instalando um programa que não é malware que você pode desinstalar com facilidade?
Bakuriu 1/08/16
2
Aguarde até descobrir "rm -rf directoryA / directoryB /" ( não tente! ). Você precisa ter cuidado com o que digita e cola como raiz.
Pjc50 01/08/19

Respostas:

29

O comando

sudo apt-get install g++ 5.0 

indica que você deseja instalar dois pacotes: g++e 5.0. (Os nomes dos pacotes não têm espaços e o apt-get aceita vários nomes de pacotes, separados por espaços.)

O que provavelmente aconteceu foi que ele instalou o g ++ conforme solicitado e instalou todos os pacotes (incluindo números de versão) que correspondem à expressão regular 5.0(já que não há realmente nenhum pacote nomeado 5.0). (obrigado @edwinksl!)

Para evitar isso, verifique se você tem os nomes de pacotes corretos, sem espaços. Você também pode usar a -sopção para simular uma ação apt-get antes de realizá-la:

sudo apt-get -s install g++ 5.0

irá mostrar-lhe as ações que o comando seria realizar, sem realmente instalar qualquer coisa. Se parecer bom, você pode remover o -spara executar a instalação.

Você também pode considerar usar um gerenciador de pacotes gráficos mais amigável para iniciantes, como synapticou muon.

Nick Weinberg
fonte
4
5.0está sendo usado como um regex, portanto, aptestá fazendo mais do que apenas corresponder à string "5.0".
edwinksl
10
Para as pessoas que não estão familiarizadas regex, um ponto corresponde a qualquer caractere único. E como uma correspondência de regex, por padrão, aparece em qualquer lugar de uma string, "5.0"significa "qualquer nome que contenha 5, seguido de 2 caracteres depois por 0". Exemplos "FooBar 2.510" ou "AcmeWidgets 5.0" ( "qualquer caractere" não inclui um ponto literal)
MSalters
8

O comando correto para instalar a g++versão 5.x é:

sudo apt-get install g++-5

Isso instalará a g++versão 5.3 no xenial, que é o padrão atual (então a apt-get install g++instala também, mas isso mudará no futuro). De fato, não há versão pública 5.0 do GCC. Outras g++versões são empacotadas, por exemplo, g++-4.9ou g++-6, que podem ser instaladas da mesma maneira.

Se você precisar instalar uma versão específica (existente) g++que não esteja empacotada para o seu sistema, precisará construí-la a partir de fontes .

Dmitry Grigoryev
fonte
2
Este é um bom ponto; sudo apt install g++5.0(sem o espaço entre g++e 5.0) ainda teria falhado.
Edwinksl
4

Vamos dividir.

Primeiro, poucas notas sobre como apt-get install(e a maioria dos outros apt-getargumentos também) funcionam:

  • Você pode inserir vários nomes de pacotes:

    sudo apt-get install foobar spamegg 
    
  • Na verdade, os nomes dos pacotes são man 7 regexpadrões ERE (Expressão regular estendida) (verificação ); portanto, um nome de pacote foo.barsignifica qualquer nome de pacote que tenha uma subcadeia que comece com fooe termine barcom qualquer caractere único entre fooe bar. Provável f.*rsignifica qualquer nome de pacote que contenha uma subcadeia que possua fe rcom qualquer número de caracteres, isto é, qualquer coisa no meio. Para fazer a correspondência completa do nome do pacote, use os tokens de início e término, por exemplo ^foo.bar$. Se você deseja que qualquer token Regex seja tratado literalmente, precisa escapar do token com, \por exemplo, para tratar foo.barliteralmente, é necessário:

    sudo apt-get install 'foo\.bar'
    

    Aqui, a citação única é para impedir a interpretação do shell como um padrão globbing, não necessário neste caso, mas seria necessário, por exemplo, para o padrão, foo.*barse você tiver um arquivo no diretório atual chamado, por exemplo foo.bar.

  • Há um problema na consideração do nome do pacote. Se houver algum pacote correspondente ao padrão, o padrão será tratado literalmente e nenhuma interpretação do Regex será feita. Por exemplo, para um padrão de pacote g++, ele corresponderá ao pacote g++literalmente, independentemente do token Regex +. Se não houver um pacote nomeado g++nos repositórios definidos, ele será tratado como um padrão ERE.

Agora, você deu o comando:

sudo apt-get install g++ 5.0

Isso significa:

  • Você deseja instalar dois pacotes fornecidos por padrões, a saber g++e5.0

  • g++corresponde ao meta-pacote literal, g++como mencionado acima

  • A parte restante,, 5.0possui um token Regex, .ou seja , qualquer caractere único. Portanto, isso corresponderá a qualquer nome de pacote que contenha 5<any_character>0. Portanto, todos os pacotes que possuem a correspondência foram selecionados para instalação e, presumivelmente virtualbox-5.0, também foram selecionados no processo.

Presumivelmente, você deseja instalar a g++versão 5, o que faria o seguinte ( já mencionado nesta resposta ); O meta-pacote g++-5,, irá se referir ao último pacote menor disponível da g++versão 5:

sudo apt-get install g++-5

Para procurar pacotes, nos repositórios configurados, use apt-cache(usa o ERE como apt-get):

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

Se você não deseja regexá-lo, use lesspara rolar a lista um pouco maior:

apt-cache search g++ | less

Antes de instalar qualquer coisa que você não tenha certeza, não use a opção -y( --assume-yes) e teste-a primeiro com -s( --simulate/ --dry-run):

sudo apt-get install --dry-run foobar
heemail
fonte
1
+1 Resposta mais completa e organizada. Tentativa de correspondências literais antes de recuar nos REs; o uso de ER estendido (em oposição aos ER simples); a capacidade de apt-cache searchser importante é estar ciente.
Arielf