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?
apt-get
bittet den Benutzer um Bestätigung, so dass Sien
VirtualBox 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.a major security issue with the Linux terminal
Nein, beruhige dich. Dies war nur (keine Beleidigung!),apt-get
Dass Sie nicht richtig lesen / tippen - kein Problem mit Linux oder einem der vielen verschiedenen Terminals, die verfügbar sind.Antworten:
Der Befehl
gibt an, dass Sie zwei Pakete installieren möchten:
g++
und5.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 gibt5.0
). (danke @edwinksl!)Um dies zu vermeiden, stellen Sie sicher, dass Sie die richtigen Paketnamen ohne Leerzeichen haben. Sie können die
-s
Option auch verwenden , um eine apt-get-Aktion zu simulieren, bevor Sie sie in die Realität umsetzen: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
synaptic
oder verwendenmuon
.quelle
5.0
wird als regulärer Ausdruck verwendet, esapt
geht also nicht nur darum, die Zeichenfolge "5.0" abzugleichen.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)Der richtige Befehl zum Installieren von
g++
Version 5.x lautet:Dadurch wird
g++
Version 5.3 auf xenial installiert. Dies ist die derzeitige Standardeinstellung (wird auchapt-get install g++
installiert, dies wird sich jedoch in Zukunft ändern). Tatsächlich gibt es keine öffentliche Version 5.0 von GCC. Andereg++
Releases sind gepackt, z. B.g++-4.9
oderg++-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 .quelle
sudo apt install g++5.0
(ohne das Leerzeichen zwischeng++
und5.0
) wäre trotzdem gescheitert.Lassen Sie es uns aufschlüsseln.
Zunächst einige Anmerkungen zur Funktionsweise
apt-get install
(und zu den meisten anderenapt-get
Argumenten):Sie können mehrere Paketnamen eingeben:
Die Paketnamen sind ERE-
man 7 regex
Muster (Extended Regular Expression, erweiterter regulärer Ausdruck). Ein Paketnamefoo.bar
bedeutet also jeden Paketnamen, der eine Teilzeichenfolge hat, die mit einem einzelnen Zeichen zwischen und beginntfoo
und 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:bar
foo
bar
f.*r
f
r
^foo.bar$
\
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.*bar
wenn sich im aktuellen Verzeichnis eine Datei mit dem Namen zfoo.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+
. Wenng++
in den definierten Repositorys kein Paket benannt wurde, wird es als ERE-Muster behandelt.Nun haben Sie den Befehl gegeben:
Das heisst:
Sie möchten zwei mitgelieferte Pakete namens
g++
und installieren5.0
g++
stimmt mit demg++
oben erwähnten wörtlichen Metapaket übereinDer verbleibende Teil
5.0
hat ein Regex-Token,.
dh ein beliebiges einzelnes Zeichen. Dies stimmt also mit jedem Paketnamen überein, der enthält5<any_character>0
. Daher wurden alle Pakete, für die die Übereinstimmung ausgewählt wurde, zur Installation ausgewählt und vermutlichvirtualbox-5.0
auch im Verlauf ausgewählt.Vermutlich möchten Sie die
g++
Version installieren5
, so dass Folgendes zutrifft ( bereits in dieser Antwort erwähnt ). Das Metapaketg++-5
bezieht sich auf das neueste verfügbare kleinere veröffentlichte Paket derg++
Version 5:Um innerhalb der konfigurierten Repositorys nach Paketen zu suchen, verwenden Sie
apt-cache
(verwendet ERE wieapt-get
):Wenn Sie es nicht erneut prüfen möchten, scrollen Sie mit
less
in der größeren Liste nach unten: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
):quelle
apt-cache search
alle wichtig zu sein, sich dessen bewusst zu sein.