Dlaczego apt-get zainstalował Virtual Box zamiast g ++?

12

Właśnie natrafiłem na coś, co według mnie może być poważnym problemem bezpieczeństwa w terminalu Linux. Próbowałem zainstalować g ++ 5.0. Jestem nowicjuszem w Linuksie, więc właśnie napisałem sudo apt-get install g++ 5.0. Zamiast zwracać błąd lub coś takiego, zainstalował Virtual Box!

Jeśli spróbuję zainstalować jedną rzecz z terminala, a ona zainstaluje coś zupełnie innego, czy to oznacza, że ​​może się przydarzyć coś innego, być może złośliwe oprogramowanie? Dlaczego miałby instalować Virtual Box, kiedy i tak wpisuję coś zupełnie innego?

heemayl
źródło
6
... AFAIK apt-getpoprosi użytkownika o potwierdzenie, abyś mógł po prostu wstawić ni uniknąć instalacji VirtualBox ... Również repozytorium Ubuntu jest sprawdzane, więc nie powinno być żadnego pakietu złośliwego oprogramowania, który można zainstalować w pierwszej kolejności. Jeśli dodasz losowe PPA, może się to zdarzyć, ale dlatego, że powiedziałeś Ubuntu, aby instalował aplikacje z niezaufanego źródła.
Bakuriu
1
Ulubiony (i oczywiście +1), ponieważ to pytanie naprawdę na to zasługuje . Pokazuje (nieodwracalne) złe skutki niewystarczającej troski o swoje działania i jest motywacją do tego, abyś nie popełnił tego samego, nieostrożnego błędu.
EKons,
12
a major security issue with the Linux terminalNie, uspokój się. To było po prostu (bez obrazy!), apt-getŻe nie czytasz / piszesz poprawnie - nie ma problemu z Linuksem ani z żadnym z wielu różnych dostępnych terminali.
underscore_d
2
@ ΈρικΚωνσταντόπουλος Jakie są „nieodwracalne złe skutki”? Instalujesz program inny niż złośliwe oprogramowanie, który możesz równie łatwo odinstalować?
Bakuriu
2
Poczekaj, aż odkryjesz „rm -rf katalogA / katalogB /” ( nie próbuj! ). Musisz uważać na to, co wpisujesz i wklejasz jako root.
pjc50

Odpowiedzi:

29

Komenda

sudo apt-get install g++ 5.0 

wskazuje, że chcesz zainstalować dwa pakiety: g++i 5.0. (W nazwach pakietów nie ma spacji, a apt-get przyjmuje wiele nazw pakietów, oddzielonych spacjami).

Prawdopodobnie stało się tak, że zainstalował g ++ zgodnie z żądaniem, a następnie zainstalował wszystkie pakiety (w tym numery wersji), które pasują do wyrażenia regularnego 5.0(ponieważ tak naprawdę nie ma pakietu o nazwie 5.0). (dzięki @edwinksl!)

Aby tego uniknąć, upewnij się, że masz poprawne nazwy pakietów, bez spacji. Możesz także skorzystać z tej -sopcji, aby symulować działanie apt-get przed wykonaniem go naprawdę:

sudo apt-get -s install g++ 5.0

pokaże działania, które wykona polecenie , bez instalowania czegokolwiek. Jeśli wygląda to OK, możesz usunąć, -saby wykonać instalację.

Możesz również rozważyć użycie bardziej przyjaznego dla początkujących menedżera pakietów graficznych, takiego jak synapticlub muon.

Nick Weinberg
źródło
4
5.0jest używany jako wyrażenie regularne, więc aptrobi coś więcej niż tylko dopasowanie łańcucha „5.0”.
edwinksl
10
Dla osób, które nie są zaznajomione regex, kropka pasuje do każdego pojedynczego znaku. A ponieważ dopasowanie wyrażenia regularnego domyślnie wygląda w dowolnym miejscu ciągu, "5.0"oznacza „dowolną nazwę zawierającą 5, po której 2 znaki później przez 0”. Przykłady „FooBar 2.510” lub „AcmeWidgets 5.0” („dowolny pojedynczy znak” zawiera dosłowną kropkę)
MSalters
8

Prawidłowe polecenie instalacji g++wersji 5.x to:

sudo apt-get install g++-5

Spowoduje to zainstalowanie g++wersji 5.3 na Xenial, która jest bieżącą wartością domyślną (więc również apt-get install g++ją instaluje, ale zmieni się to w przyszłości). W rzeczywistości nie ma publicznej wersji 5.0 GCC. Inne g++wydania są pakowane, np. g++-4.9Lub g++-6, które można zainstalować w ten sam sposób.

Jeśli kiedykolwiek będziesz musiał zainstalować konkretną (istniejącą) wersję, g++która nie jest spakowana dla twojego systemu, będziesz musiał zbudować ją ze źródeł .

Dmitrij Grigoriew
źródło
2
To dobra uwaga; sudo apt install g++5.0(bez odstępu między g++i 5.0) nadal by się nie udało.
edwinksl
4

Rozwalmy to.

Przede wszystkim kilka uwag na temat działania apt-get install(i większości innych apt-getargumentów):

  • Możesz wprowadzić wiele nazw pakietów:

    sudo apt-get install foobar spamegg 
    
  • Nazwy pakietów są w rzeczywistości man 7 regexwzorcami rozszerzonego wyrażenia regularnego (ERE) (Check ), więc nazwa pakietu foo.baroznacza każdą nazwę pakietu, która ma podłańcuch, który zaczyna się fooi kończy na bardowolnym znaku między fooi bar. Prawdopodobnie f.*roznacza dowolną nazwę pakietu, który zawiera podciąg, który ma fi rz dowolnej liczby znaków tj niczego pomiędzy. Aby dopasować całą nazwę pakietu, użyj tokenów początkowych i końcowych, np ^foo.bar$. Jeśli chcesz, aby dowolny token Regex był traktowany dosłownie, musisz uciec z tokena \np. W celu foo.bardosłownego traktowania , potrzebujesz:

    sudo apt-get install 'foo\.bar'
    

    W tym przypadku pojedyncze cytowanie ma zapobiec interpretacji powłoki przez wzorzec jako wzorzec globowania, co w tym przypadku nie jest konieczne, ale byłoby potrzebne np. Do wzorca, foo.*barjeśli w bieżącym katalogu znajduje się plik o nazwie np foo.bar.

  • Uwzględnienie nazwy pakietu jest pewne. Jeśli istnieje jakikolwiek pakiet pasujący do wzorca, wzorzec będzie traktowany dosłownie i nie zostanie wykonana interpretacja Regex. Na przykład w przypadku wzorca pakietu g++będzie on pasował do pakietu g++dosłownie niezależnie od tokena Regex +. Jeśli g++w zdefiniowanych repozytoriach nie ma nazwanego pakietu , będzie on traktowany jako wzorzec ERE.

Teraz wydałeś polecenie:

sudo apt-get install g++ 5.0

To znaczy:

  • Chcesz zainstalować dwa dostarczone pakiety wzorców mianowicie g++i5.0

  • g++dopasowuje dosłowny meta-pakiet, g++jak wspomniano powyżej

  • Pozostała część 5.0,, ma token Regex, .tj. Dowolny pojedynczy znak. To pasuje do każdej nazwy pakietu, która zawiera 5<any_character>0. Tak więc wszystkie pakiety, które są zgodne, zostały wybrane do zainstalowania i prawdopodobnie virtualbox-5.0również zostały wybrane w tym procesie.

Prawdopodobnie chcesz zainstalować g++wersję 5, więc wykonanie poniższych czynności ( już wspomnianych w tej odpowiedzi ); Metapakiet g++-5będzie odnosił się do najnowszego dostępnego mniejszego wydanego pakietu g++wersji 5:

sudo apt-get install g++-5

Aby wyszukać dowolne pakiety w obrębie skonfigurowanych repozytoriów, użyj apt-cache(używa ERE jak apt-get):

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

Jeśli nie chcesz go ponownie zexeksować, użyj, lessaby przewinąć w dół raczej większej listy:

apt-cache search g++ | less

Również przed instalacją czegokolwiek, czego nie jesteś pewien, nie używaj opcji -y( --assume-yes) i najpierw przetestuj za pomocą -s( --simulate/ --dry-run):

sudo apt-get install --dry-run foobar
heemayl
źródło
1
+1 Najbardziej kompletna i zorganizowana odpowiedź. Próbowanie dosłownych dopasowań przed powrotem do RE; zastosowanie rozszerzonego RE (w przeciwieństwie do zwykłych RE); umiejętność apt-cache searchbycia ważnym jest, aby być świadomym.
arielf