Warum hat apt-get Virtual Box anstelle von g ++ installiert?

12

Ich bin gerade auf etwas gestoßen, von dem ich mich frage, ob es möglicherweise ein großes Sicherheitsproblem mit dem Linux-Terminal gibt. Ich habe versucht, g ++ 5.0 zu installieren. Ich bin ein Neuling in Linux, also habe ich nur getippt sudo apt-get install g++ 5.0. Anstatt nur einen Fehler oder etwas zurückzugeben, installierte es Virtual Box!

Wenn ich versuche, eine Sache vom Terminal aus zu installieren und etwas völlig anderes installiere, kann das dann mit etwas anderem geschehen, möglicherweise mit Malware? Warum sollte Virtual Box installiert werden, wenn ich etwas völlig anderes eingab?

heemayl
quelle
6
... AFAIK apt-getbittet den Benutzer um Bestätigung, so dass Sie nVirtualBox einfach einfügen und die Installation vermeiden können. ... Auch das Ubuntu-Repository wird überprüft, sodass es kein Malware-Paket geben sollte, das Sie überhaupt installieren können. Wenn Sie zufällige PPAs hinzufügen, kann dies passieren, aber das liegt daran, dass Sie Ubuntu angewiesen haben, Anwendungen von einer nicht vertrauenswürdigen Quelle zu installieren.
Bakuriu
1
Fav'd (und + 1'ed natürlich), weil diese Frage es wirklich verdient . Es zeigt die (irreversiblen) negativen Auswirkungen einer unzureichenden Berücksichtigung Ihrer Handlungen und ist eine Motivation für Sie, nicht den gleichen, unachtsamen Fehler zu machen.
EKons
12
a major security issue with the Linux terminalNein, beruhige dich. Dies war nur (keine Beleidigung!), apt-getDass Sie nicht richtig lesen / tippen - kein Problem mit Linux oder einem der vielen verschiedenen Terminals, die verfügbar sind.
Underscore_d
2
@ ΈρικΚωνσταντόπουλος Was sind die "irreversiblen negativen Auswirkungen"? Installieren Sie ein Nicht-Malware-Programm, das Sie genauso einfach deinstallieren können?
Bakuriu
2
Warten Sie, bis Sie "rm -rf directoryA / directoryB /" gefunden haben ( versuchen Sie es nicht! ). Sie müssen vorsichtig sein, was Sie als root eingeben und einfügen.
pjc50

Antworten:

29

Der Befehl

sudo apt-get install g++ 5.0 

gibt an, dass Sie zwei Pakete installieren möchten: g++und 5.0. (Paketnamen haben keine Leerzeichen und apt-get akzeptiert mehrere durch Leerzeichen getrennte Paketnamen.)

Was wahrscheinlich passiert ist, ist, dass es g ++ wie gewünscht installiert und dann alle Pakete (einschließlich der Versionsnummern) installiert hat, die mit dem regulären Ausdruck übereinstimmen 5.0(da es kein Paket mit dem tatsächlichen Namen gibt 5.0). (danke @edwinksl!)

Um dies zu vermeiden, stellen Sie sicher, dass Sie die richtigen Paketnamen ohne Leerzeichen haben. Sie können die -sOption auch verwenden , um eine apt-get-Aktion zu simulieren, bevor Sie sie in die Realität umsetzen:

sudo apt-get -s install g++ 5.0

zeigt Ihnen die Aktionen an, die der Befehl ausführen würde , ohne tatsächlich etwas zu installieren. Wenn es in Ordnung aussieht, können Sie das entfernen -s, um die Installation durchzuführen.

Sie können auch einen neueren grafischen Paketmanager wie synapticoder verwenden muon.

Nick Weinberg
quelle
4
5.0wird als regulärer Ausdruck verwendet, es aptgeht also nicht nur darum, die Zeichenfolge "5.0" abzugleichen.
Edwinksl
10
Für die Personen, die nicht vertraut sind regex, entspricht ein Punkt einem einzelnen Zeichen. Und da eine Regex-Übereinstimmung standardmäßig an einer beliebigen Stelle in einer Zeichenfolge angezeigt wird, "5.0"bedeutet dies "jeder Name, der eine 5 enthält, gefolgt von einer 0 nach 2 Zeichen". Beispiele "FooBar 2.510" oder "AcmeWidgets 5.0" ("ein einzelnes Zeichen" enthält einen wörtlichen Punkt)
MSalters
8

Der richtige Befehl zum Installieren von g++Version 5.x lautet:

sudo apt-get install g++-5

Dadurch wird g++Version 5.3 auf xenial installiert. Dies ist die derzeitige Standardeinstellung (wird auch apt-get install g++installiert, dies wird sich jedoch in Zukunft ändern). Tatsächlich gibt es keine öffentliche Version 5.0 von GCC. Andere g++Releases sind gepackt, z. B. g++-4.9oder g++-6, die auf die gleiche Weise installiert werden können.

Wenn Sie jemals eine bestimmte (vorhandene) Version installieren müssen, g++die nicht für Ihr System gepackt ist, müssen Sie sie aus Quellen erstellen .

Dmitry Grigoryev
quelle
2
Das ist ein guter Punkt; sudo apt install g++5.0(ohne das Leerzeichen zwischen g++und 5.0) wäre trotzdem gescheitert.
Edwinksl
4

Lassen Sie es uns aufschlüsseln.

Zunächst einige Anmerkungen zur Funktionsweise apt-get install(und zu den meisten anderen apt-getArgumenten):

  • Sie können mehrere Paketnamen eingeben:

    sudo apt-get install foobar spamegg 
    
  • Die Paketnamen sind ERE- man 7 regexMuster (Extended Regular Expression, erweiterter regulärer Ausdruck). Ein Paketname foo.barbedeutet also jeden Paketnamen, der eine Teilzeichenfolge hat, die mit einem einzelnen Zeichen zwischen und beginnt foound mit diesem endet . Wahrscheinlich ist jede Paketnamen , die eine Teil enthält, hat und mit einer beliebigen Anzahl von Zeichen etwas dh dazwischen. Um den gesamten Paketnamen abzugleichen, verwenden Sie Start- und End-Token, z . Wenn Sie möchten, dass ein Regex-Token im wahrsten Sinne des Wortes behandelt wird , müssen Sie dem Token entgehen, z. B. um ihn im wahrsten Sinne des Wortes zu behandeln . Sie benötigen:barfoobarf.*rfr^foo.bar$\foo.bar

    sudo apt-get install 'foo\.bar'
    

    Hier soll das einfache Anführungszeichen verhindern, dass das Muster in der Shell als Globbing-Muster interpretiert wird. Dies ist in diesem Fall nicht erforderlich, wird aber z. B. für Muster benötigt, foo.*barwenn sich im aktuellen Verzeichnis eine Datei mit dem Namen z foo.bar.

  • Es gibt einen Haken bei der Überlegung des Paketnamens. Wenn es ein Paket gibt, das dem Muster entspricht, wird das Muster wörtlich behandelt und es wird keine Regex-Interpretation durchgeführt. Beispielsweise stimmt ein Paketmuster buchstäblich g++mit dem Paket überein, g++unabhängig vom Regex-Token +. Wenn g++in den definierten Repositorys kein Paket benannt wurde, wird es als ERE-Muster behandelt.

Nun haben Sie den Befehl gegeben:

sudo apt-get install g++ 5.0

Das heisst:

  • Sie möchten zwei mitgelieferte Pakete namens g++und installieren5.0

  • g++stimmt mit dem g++oben erwähnten wörtlichen Metapaket überein

  • Der verbleibende Teil 5.0hat ein Regex-Token, .dh ein beliebiges einzelnes Zeichen. Dies stimmt also mit jedem Paketnamen überein, der enthält 5<any_character>0. Daher wurden alle Pakete, für die die Übereinstimmung ausgewählt wurde, zur Installation ausgewählt und vermutlich virtualbox-5.0auch im Verlauf ausgewählt.

Vermutlich möchten Sie die g++Version installieren 5, so dass Folgendes zutrifft ( bereits in dieser Antwort erwähnt ). Das Metapaket g++-5bezieht sich auf das neueste verfügbare kleinere veröffentlichte Paket der g++Version 5:

sudo apt-get install g++-5

Um innerhalb der konfigurierten Repositorys nach Paketen zu suchen, verwenden Sie apt-cache(verwendet ERE wie apt-get):

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

Wenn Sie es nicht erneut prüfen möchten, scrollen Sie mit lessin der größeren Liste nach unten:

apt-cache search g++ | less

Auch bevor Sie etwas installieren, bei dem Sie sich nicht sicher sind, verwenden Sie nicht die Option -y( --assume-yes) und testen Sie es zuerst mit -s( --simulate/ --dry-run):

sudo apt-get install --dry-run foobar
heemayl
quelle
1
+1 Vollständigste und organisierteste Antwort. Versuchen Sie es mit wörtlichen Übereinstimmungen, bevor Sie auf REs zurückgreifen. die Verwendung von Extended RE (im Gegensatz zu Plain REs); die Fähigkeit, apt-cache searchalle wichtig zu sein, sich dessen bewusst zu sein.
Arielf