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?
apt-get
solicitará confirmação do usuário, para que você possa inserirn
e 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.a major security issue with the Linux terminal
Não, acalme-se. Isso foi apenas (sem ofensa!) Que você não leu / digitou corretamente - nenhum problema com o Linuxapt-get
ou qualquer um dos muitos terminais diferentes disponíveis.Respostas:
O comando
indica que você deseja instalar dois pacotes:
g++
e5.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 nomeado5.0
). (obrigado @edwinksl!)Para evitar isso, verifique se você tem os nomes de pacotes corretos, sem espaços. Você também pode usar a
-s
opção para simular uma ação apt-get antes de realizá-la:irá mostrar-lhe as ações que o comando seria realizar, sem realmente instalar qualquer coisa. Se parecer bom, você pode remover o
-s
para executar a instalação.Você também pode considerar usar um gerenciador de pacotes gráficos mais amigável para iniciantes, como
synaptic
oumuon
.fonte
5.0
está sendo usado como um regex, portanto,apt
está fazendo mais do que apenas corresponder à string "5.0".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)O comando correto para instalar a
g++
versão 5.x é:Isso instalará a
g++
versão 5.3 no xenial, que é o padrão atual (então aapt-get install g++
instala também, mas isso mudará no futuro). De fato, não há versão pública 5.0 do GCC. Outrasg++
versões são empacotadas, por exemplo,g++-4.9
oug++-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 .fonte
sudo apt install g++5.0
(sem o espaço entreg++
e5.0
) ainda teria falhado.Vamos dividir.
Primeiro, poucas notas sobre como
apt-get install
(e a maioria dos outrosapt-get
argumentos também) funcionam:Você pode inserir vários nomes de pacotes:
Na verdade, os nomes dos pacotes são
man 7 regex
padrões ERE (Expressão regular estendida) (verificação ); portanto, um nome de pacotefoo.bar
significa qualquer nome de pacote que tenha uma subcadeia que comece comfoo
e terminebar
com qualquer caractere único entrefoo
ebar
. Provávelf.*r
significa qualquer nome de pacote que contenha uma subcadeia que possuaf
er
com 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 tratarfoo.bar
literalmente, é necessário: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.*bar
se você tiver um arquivo no diretório atual chamado, por exemplofoo.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 pacoteg++
literalmente, independentemente do token Regex+
. Se não houver um pacote nomeadog++
nos repositórios definidos, ele será tratado como um padrão ERE.Agora, você deu o comando:
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 acimaA parte restante,,
5.0
possui um token Regex,.
ou seja , qualquer caractere único. Portanto, isso corresponderá a qualquer nome de pacote que contenha5<any_character>0
. Portanto, todos os pacotes que possuem a correspondência foram selecionados para instalação e, presumivelmentevirtualbox-5.0
, também foram selecionados no processo.Presumivelmente, você deseja instalar a
g++
versão5
, o que faria o seguinte ( já mencionado nesta resposta ); O meta-pacoteg++-5
,, irá se referir ao último pacote menor disponível dag++
versão 5:Para procurar pacotes, nos repositórios configurados, use
apt-cache
(usa o ERE comoapt-get
):Se você não deseja regexá-lo, use
less
para rolar a lista um pouco maior: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
):fonte
apt-cache search
ser importante é estar ciente.