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?
apt-get
poprosi użytkownika o potwierdzenie, abyś mógł po prostu wstawićn
i 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.a major security issue with the Linux terminal
Nie, 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.Odpowiedzi:
Komenda
wskazuje, że chcesz zainstalować dwa pakiety:
g++
i5.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 nazwie5.0
). (dzięki @edwinksl!)Aby tego uniknąć, upewnij się, że masz poprawne nazwy pakietów, bez spacji. Możesz także skorzystać z tej
-s
opcji, aby symulować działanie apt-get przed wykonaniem go naprawdę:pokaże działania, które wykona polecenie , bez instalowania czegokolwiek. Jeśli wygląda to OK, możesz usunąć,
-s
aby wykonać instalację.Możesz również rozważyć użycie bardziej przyjaznego dla początkujących menedżera pakietów graficznych, takiego jak
synaptic
lubmuon
.źródło
5.0
jest używany jako wyrażenie regularne, więcapt
robi coś więcej niż tylko dopasowanie łańcucha „5.0”.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ę)Prawidłowe polecenie instalacji
g++
wersji 5.x to: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. Inneg++
wydania są pakowane, np.g++-4.9
Lubg++-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ł .źródło
sudo apt install g++5.0
(bez odstępu międzyg++
i5.0
) nadal by się nie udało.Rozwalmy to.
Przede wszystkim kilka uwag na temat działania
apt-get install
(i większości innychapt-get
argumentów):Możesz wprowadzić wiele nazw pakietów:
Nazwy pakietów są w rzeczywistości
man 7 regex
wzorcami rozszerzonego wyrażenia regularnego (ERE) (Check ), więc nazwa pakietufoo.bar
oznacza każdą nazwę pakietu, która ma podłańcuch, który zaczyna sięfoo
i kończy nabar
dowolnym znaku międzyfoo
ibar
. Prawdopodobnief.*r
oznacza dowolną nazwę pakietu, który zawiera podciąg, który maf
ir
z 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 celufoo.bar
dosłownego traktowania , potrzebujesz: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.*bar
jeśli w bieżącym katalogu znajduje się plik o nazwie npfoo.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 pakietug++
dosłownie niezależnie od tokena Regex+
. Jeślig++
w zdefiniowanych repozytoriach nie ma nazwanego pakietu , będzie on traktowany jako wzorzec ERE.Teraz wydałeś polecenie:
To znaczy:
Chcesz zainstalować dwa dostarczone pakiety wzorców mianowicie
g++
i5.0
g++
dopasowuje dosłowny meta-pakiet,g++
jak wspomniano powyżejPozostała część
5.0
,, ma token Regex,.
tj. Dowolny pojedynczy znak. To pasuje do każdej nazwy pakietu, która zawiera5<any_character>0
. Tak więc wszystkie pakiety, które są zgodne, zostały wybrane do zainstalowania i prawdopodobnievirtualbox-5.0
ró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 ); Metapakietg++-5
będzie odnosił się do najnowszego dostępnego mniejszego wydanego pakietug++
wersji 5:Aby wyszukać dowolne pakiety w obrębie skonfigurowanych repozytoriów, użyj
apt-cache
(używa ERE jakapt-get
):Jeśli nie chcesz go ponownie zexeksować, użyj,
less
aby przewinąć w dół raczej większej listy: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
):źródło
apt-cache search
bycia ważnym jest, aby być świadomym.