Ist `sudo pip install` immer noch eine fehlerhafte Praxis?

38

Ich bin neu in Ubuntu, also bitte trage mich. Ich installierte pipdiesen Befehl: sudo apt-get -y install python-pip. Dann habe ich installiert NLTK auf ihrer Website mit dem Befehl, die lautete: sudo pip install -U nltk. Aber dann bin ich auf diese Frage gestoßen , die besagt, dass alles, was ich getan habe, eine "gebrochene Praxis" war. Die Linie, die mich am meisten beeindruckte, war, dass die Verwendung von sudo pipNatur aus falsch ist und dass pipzu viel Kraft die Dateien des Betriebssystems beschädigen kann. Kann jemand diese Behauptung bestätigen?

Hinweis - Ich habe nur verwendet, sudoweil ich bei der Ausführung des Befehls apt-get -y install python-pip2 Fehler erhielt:

E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
was was Was
quelle
3
Anweisungen sudo pip installsind von Natur aus falsch. - von stackoverflow.com/a/33004920/95735
Piotr Dobrogost
"... von Natur aus ..." pshaw
michael
Sorry, sudo pip installist so schlecht wie curl "some-url" | sudo bashinstalliert. In ähnlicher Weise gab es einige Male, in denen einige Entwickler sudo pip installAbhängigkeiten von ihrer Workstation installierten, dann fehlerhaften Code in das Repository eincheckten, weil die Datei requirements.txtoder setup.pyfehlte, was auch immer sie installierten, und alle anderen mussten herausfinden, welche Abhängigkeit benötigt wurde während der Typ im Urlaub war.
Mike DeSimone

Antworten:

52

Beide sudo pip installund seine andere gemeinsame Variante sudo -H pip installsollten nichtpip empfohlen werden, da es ein Sicherheitsrisiko darstellt, Root-Berechtigungen für die Installation von Python-Paketen von PyPI (Python Package Index) zu verwenden.

Von https://stackoverflow.com/a/21056000/486919 (Schwerpunkt Mine):

Wenn du pipmit sudorennst, rennst du setup.pymit sudo. Mit anderen Worten, Sie führen beliebigen Python-Code aus dem Internet als root aus. Wenn jemand ein bösartiges Projekt auf PyPI erstellt und Sie es installieren, gewähren Sie einem Angreifer root-Zugriff auf Ihren Computer. Vor einigen kürzlichen Korrekturen an pipund PyPI konnte ein Angreifer auch einen Mann in der Mitte angreifen, um seinen Code einzufügen, wenn Sie ein vertrauenswürdiges Projekt herunterladen.

Wie unter https://security.stackexchange.com/a/79327/8761 erwähnt , muss beachtet werden, dass jeder Python-Pakete, auch böswillige, auf PyPI hochladen kann.

Kurz gesagt, in Übereinstimmung mit dem Prinzip der geringst möglichen Privilegien , verwenden Sie nicht sudomit pipPython - Pakete von PyPI zu installieren , wenn Sie unbedingt benötigen. Erwägen Sie stattdessen die Verwendung pip install --user(beachten Sie, dass derzeit unter Ubuntu pip installkeine sudooder keine zusätzlichen Flags / Optionen standardmäßig verwendet werden pip install --user) oder virtueller Umgebungen (wie z. B. virtualenv). Wenn Sie Leute sehen, die sudo pipoder empfehlen sudo -H pip, bitten Sie sie, dies nicht zu tun.

edwinksl
quelle
2
Wie räume ich auf, wenn ich es in der Vergangenheit verwendet habe?
Endolith
1
Also sind diese Anweisungen falsch? tensorflow.org/install/install_linux
endolith
5
@ Endolith Sie können sudo den Pip deinstallieren, um rückgängig zu machen. Wenn das Paket jedoch von einem vertrauenswürdigen Betreuer stammt, z. B. Tensorflow, Numpy usw., lautet die Sicherheitsanforderung "aye! Security!" Argument macht nicht wirklich Sinn. (Auch wenn Sie ein schädliches Paket installieren, selbst als "--user", sind Sie im Grunde genommen sowieso beschissen. Die eigentliche Regel sollte lauten: Installieren Sie keinen Code von unbekannten / nicht vertrauenswürdigen Personen ... außer in einem Container - aber Auch dann nicht zu empfehlen.)
Michael
2
@endolith In diesen Anweisungen steht nicht, dass sudo verwendet werden soll. Vielleicht haben sie früher und sie haben den Fehler ihrer Wege gesehen? :)
David Gardner
1
sudo pip installkann "alte" vom System installierte Python-Pakete deinstallieren, was das Aktualisieren oder Deinstallieren dieser Betriebssystempakete erschwert. sudo pip uninstallhilft hier nicht, weil es das neue Paket entfernt, aber die Dateien vom alten nicht wiederherstellt. (Mein Kollege R. Zagar geht in einer anderen Antwort näher darauf ein.)
Mike DeSimone
19

Sie müssen verwenden sudopip installieren mit apt ( sudo apt install python-pip), aber wie in angegeben edwinksl Antwort sollten Sie nicht verwenden , sudoPakete zu installieren , um mit pip , sollten Sie pip install --user <package>nur für Ihre Benutzer zu installieren, oder eine Verwendung virtualenv noch weiter , um den Umfang des Pakets einschränken .

Apt installiert Pakete aus Ubuntus Repositorys, während pip vom Benutzer hochgeladene Pakete aus PyPi installiert, die bösartig sein könnten.

Pizzapants184
quelle
7

Und für eine mildere Antwort:

  1. Sie müssen es in der Tat immer tun sudo apt-get install ..., genau so wurde das Tool entwickelt, um zu funktionieren.
  2. Die Verwendung von sudo [-H]with pip installist sowohl möglich als auch optional, je nachdem, was genau Sie tun möchten (und daher "Kontroverse").

Eines der Mottos von Python lautet: "Es sollte einen - und am besten nur einen - offensichtlichen Weg geben, dies zu tun." Und wie die meisten Mottos ist es scheinbar bei jeder Gelegenheit mit sardonischer Freude gebrochen. (Deshalb gibt es Mottos, denke ich.) Leider besteht das Python-Ökosystem meiner bescheidenen Meinung nach aus vielen widersprüchlichen "harten und schnellen" Regeln, die niemals gebrochen werden dürfen ... außer wenn "yada yada yada" (Teufel, Einzelheiten usw). In fast allen Fällen liegt dies an der historischen Entwicklung der Sprache und der Tools (und wer möchte / braucht eine Geschichtsstunde, wenn er nur mit seiner Arbeit weitermachen möchte) - kann aber auch an Unterschieden in Mac / Win / * Nix-Plattformen (zB Unix / Linux hat eine ähnliche Mentalität,Nehmen Sie all diese "gebrochenen Praktiken" und "von Natur aus falschen" Frachtkultisten mit einer riesigen Prise Salz. Einige meinen es tatsächlich gut. (Andere sind nur gut gemein.)

Zuallererst bevorzugen Sie fast immer eine virtuelle Umgebung, anstatt einfache "Einzelplatzinstallationen" durchzuführen, denn in Wirklichkeit ist dies wahrscheinlich das, was Sie am Ende brauchen werden. Fangen Sie also gleich damit an. Wie das genau gemacht wird, hängt davon ab (siehe Python-Motto oben). Wenn Sie Conda verwenden (hauptsächlich für Mac und Windows), wird es mit Conda eingerichtet . Bei der Verwendung von „reinem“ Python [sic] , es hängt davon ab , welche Version und welcher Python utils Sie haben, aber virtualenvwrapper ist ziemlich praktisch.

Zweitens, nur als Gegenbeispiel zur "never sudo" -Regel, können Sie es vorziehen sudo -H pip install -U numpy, was vollkommen in Ordnung und sogar vorteilhaft ist, da es einem erlaubt, das Herunterladen / Neuinstallieren / Verwalten großer Bibliotheken zu vermeiden, wo Sie nur wollen / brauche eine version, in jeder virtualenv separat. Große, beliebte Frameworks wie Scikit-Learn, NumPy, Matplotlib, SciPy, Pandas usw. können einmalig installiert und in verschiedenen Umgebungen wiederverwendet werden . Ihr lokaler freundlicher Systemadministrator kann diese möglicherweise für jeden Benutzer auf einem System installieren. Dies geschieht natürlich auch über sudo, z. B. für kompliziertere Installationen wie TensorFlow.

Und wenn Sie eine zufällige Bibliothek von Drittanbietern installieren, die dies und das tut (Twitter-API, Text-Munging, Code-Formatierung usw.), dann bin ich vollkommen einverstanden - installieren Sie sie nicht als root über sudo. Sicher, installieren Sie es als Ihr aktueller Benutzer. Denken Sie jedoch daran, dass Ihr Benutzerkonto alle wichtigen Informationen enthält .

michael
quelle
2
Wobei "temperiert" = "kontraproduktives Handdrücken, das Verwirrung stiftet, um nicht die Gefühle anderer zu verletzen". Seien Sie einfach klar und deutlich, um Verwirrung zu vermeiden: Es ist niemals notwendig, dies als Grundlage zu verwenden, einschließlich Ihrer Beispiele. Unix ist in der Tat "Rolle deine eigene Konfiguration und Risiken", es ist buchstäblich eine C-Denkweise, aber wie dort, benutze es nicht, mallocwo du es nicht brauchst. Das --userFlag erfüllt die Anforderungen des OP und erfordert keine besonderen Berechtigungen. Sie untergraben dabei Ihre guten Argumente in Bezug auf virtualenv ... nichts "Frachtkultist" an alledem .
Benjamin R
Ich habe diese Perspektive bereits in meine Umfrage zu gemeinsamen Antworten und Meinungen aufgenommen (wenn man genau hinschaut).
Michael
1

Mit "sudo pip install" können und werden die von Ihrem Betriebssystemanbieter bereitgestellten Python-Inhalte überschrieben. In diesem Fall wird für die betroffenen Anbieterpakete keine "rpm --verify" -Verifizierung durchgeführt, und Ihre Pakete scheinen beschädigt zu sein.

Möchten Sie Systemverwaltungstools verwenden, die Ihr Betriebssystemhersteller getestet hat , oder sind nicht getestete Komponenten zulässig, die Sie aus dem Internet heruntergeladen haben?

Wenn, nicht wenn, ein bösartiges Paket auf PyPI hochgeladen wird ... werden Leute, die "sudo pip install" verwenden, diese bösartige Payload mit vollen Systemrechten ausführen. Willst du das? (#principleofleastprivileg)

Wenn es sich nur um Ihren Laptop handelt und Sie nur ein paar Katzenbilder riskieren, ist das Risiko wahrscheinlich gering. Wenn es sich jedoch um ein Mehrbenutzersystem handelt, wird das Risiko jetzt mit N multipliziert Ein System, das Wert hat, oder eine Systemverfügbarkeit oder -zuverlässigkeit, haben Wert, dann steigen auch die Risiken.

Bitte wählen Sie Ihr eigenes Abenteuer aus, holen Sie jedoch die Einwilligung der anderen Benutzer ein, die von Ihrer Wahl betroffen sein könnten. Sie fühlen sich möglicherweise nicht mit dem gleichen Risiko wie Sie wohl.

Randy Zagar
quelle
0

Um diese Antworten zu ergänzen: Ich kenne Ubuntu nicht, aber unter Fedora kann ich mithilfe des sudo dnf install python3-numpyFormats VIELE für mich nützliche Pakete installieren . Dies hat nicht den Nachteil, dass es unsicher ist (der Distributor hat Pakete validiert), sondern ermöglicht Ihnen auch die systemweite Installation. Der einzige Nachteil ist, dass die Distribution-Repo-Versionen den Paketen in PyPI möglicherweise etwas hinterherhinken.

Milind R
quelle
-1

Nein, das ist richtig. Ich kann diese Behauptung nicht bestätigen. Ich benutze immer sudo -Hmit pip. pipkann Betriebssystemdateien nur so stark beschädigen wie apt. Nur nicht sudomit verwenden, pipwenn Sie nur für diesen Benutzer installieren möchten.

fosslinux
quelle
1
Wann müssen Sie auf Ihrem PC pipsystemweit installieren ? Wenn Sie ein Sysadmin sind, ist das vielleicht eine andere Geschichte.
Benjamin R