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

12

Acabei de encontrar algo que imagino que possa ser um grande problema de segurança com o terminal Linux. Eu estava tentando instalar o g ++ 5.0. Eu sou um novato no Linux, então eu apenas digitei sudo apt-get install g++ 5.0 . Em vez de apenas retornar um erro ou algo assim, ele 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 malware? Por que instalar o Virtual Box quando eu digitei algo completamente diferente?

    
por heemayl 01.08.2016 / 01:41

3 respostas

29

O comando

sudo apt-get install g++ 5.0 

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

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

Para evitar isso, verifique se você possui os nomes de pacotes corretos, sem espaços. Você também pode usar a opção -s para simular uma ação do apt-get antes de fazer isso de verdade:

sudo apt-get -s install g++ 5.0

mostrará as ações que o comando executaria , sem instalar nada. Se estiver OK, você pode remover o -s para realizar a instalação.

Você também pode considerar o uso de um gerenciador de pacotes gráfico mais amigável para iniciantes, como synaptic ou muon .

    
por Nick Weinberg 01.08.2016 / 01:48
8

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

sudo apt-get install g++-5

Isso instalará g++ versão 5.3 no xenial, que é o padrão atual (assim, apt-get install g++ também o instala, mas isso será alterado no futuro). Na verdade, não há nenhum lançamento público 5.0 do GCC. Outras versões de g++ são empacotadas, por ex. g++-4.9 ou g++-6 , que pode ser instalado da mesma maneira.

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

    
por Dmitry Grigoryev 01.08.2016 / 12:41
4

Vamos dividi-lo.

Em primeiro lugar, algumas notas sobre como apt-get install (e a maioria dos outros argumentos apt-get ) funciona:

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

    sudo apt-get install foobar spamegg 
    
  • Os nomes dos pacotes são, na verdade, Expressão Regular Estendida (ERE) (Verificar man 7 regex ) padrões, portanto, um nome de pacote foo.bar significa qualquer nome de pacote que tenha uma substring que comece com foo e termine com bar caractere único entre foo e bar . f.*r significa qualquer nome de pacote que contenha uma subcadeia que tenha f e r com qualquer número de caracteres, ou seja, qualquer coisa entre eles. Para fazer a correspondência do nome do pacote inteiro, use tokens de início e fim, por exemplo %código%. Se você quiser que qualquer token Regex seja tratado literalmente, será necessário escapar do token com ^foo.bar$ , por exemplo. para tratar \ literalmente, você precisa:

    sudo apt-get install 'foo\.bar'
    

    Aqui, a cotação única é para evitar a interpretação da casca do padrão como um padrão de globbing, não necessário neste caso, mas seria necessário, e. para o padrão foo.bar se você tiver um arquivo no diretório atual chamado, por exemplo, foo.*bar .

  • Existe um problema na consideração do nome do pacote. Se houver algum pacote que corresponda ao padrão, o padrão será tratado literalmente e nenhuma interpretação Regex será feita. Por exemplo, para um padrão de pacote foo.bar , ele corresponderá ao pacote g++ literalmente, independentemente do token Regex g++ . Se não houver nenhum pacote chamado + 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, como g++ e g++

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

  • A parte restante, g++ , tem um token Regex, 5.0 , ou seja, qualquer caractere único. Portanto, isso corresponderá a qualquer nome de pacote que contenha . . Assim, todos os pacotes que possuem a correspondência foram selecionados para serem instalados e, presumivelmente, 5<any_character>0 também foi selecionado no processo.

Presumivelmente, você quer instalar o virtualbox-5.0 versão g++ , então seria necessário fazer o seguinte ( já mencionado nesta resposta ); O meta-pacote, 5 , irá se referir ao último pacote menor disponível de g++-5 versão 5:

sudo apt-get install g++-5

Para procurar por quaisquer pacotes, dentro dos repositórios configurados, use g++ (usa ERE como apt-cache ):

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

Se você não quiser regex-it-it, use apt-get para rolar a lista um pouco maior:

apt-cache search g++ | less

Também antes de instalar qualquer coisa que você não tenha certeza, não use a opção less ( -y ) e teste-a primeiro com --assume-yes ( -s / --simulate ):

sudo apt-get install --dry-run foobar
    
por heemayl 02.08.2016 / 15:24