Чи є "sudo pip install" все ж порушеною практикою?


38

Я новачок у Ubuntu, тому будь ласка, будьте зі мною. Я встановив з pipдопомогою цієї команди: sudo apt-get -y install python-pip. Потім я встановив NLTK використовуючи команду на своєму веб - сайті, який був: sudo pip install -U nltk. Але потім я натрапив на це питання, яке говорить, що все, що я робив, - це "зламана практика". Найбільше мене вразило те, що використання sudo pip- це суттєво неправильно, і це даванняpip занадто багато сил, може пошкодити файли операційної системи. Чи може хтось підтвердити цю претензію?

Примітка - я використовував лише те, sudoщо коли я спробував команду, apt-get -y install python-pipвін дав мені 2 помилки:

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?

3
Інструкції, що розповідають sudo pip install, по суті невірні. - від stackoverflow.com/a/33004920/95735
Пьотр Доброгост

"... по своїй суті ...." pshaw
michael

Вибачте, sudo pip installце так само погано, як і curl "some-url" | sudo bashвстановлення. Крім того , у нас було кілька разів , коли деякі розробник використовуваних sudo pip installдля встановлення якої - то залежно від робочої станції, а потім перевіряється на ламаній коді в репозиторій , оскільки requirements.txtабо setup.pyфайл був відсутній , що вони встановлені, і всі інші повинні з'ясувати , що було необхідна залежність поки хлопець був у відпустці.
Майк Десимоне

Відповіді:


52

Як sudo pip installі його інші загальний варіант sudo -H pip installслід НЕ заохочувати , тому що це ризик для безпеки використання привілеїв суперкористувача для використанняpip для установки пакетів Python з PyPI (Python Index Package).

З https://stackoverflow.com/a/21056000/486919 (моє наголос):

Коли ти біжиш pipіз sudo, ти біжиш setup.pyіз sudo. Іншими словами, ви запускаєте довільний код Python з Інтернету як корінь. Якщо хтось виставляє зловмисний проект на PyPI, і ви встановлюєте його, ви даєте кореневому доступу зловмисника до вашої машини. Перед деякими останніми виправленнями до pipта PyPI, зловмисник також міг запустити людину в атаку середнього, щоб ввести їх код під час завантаження надійного проекту.

Як було зазначено на https://security.stackexchange.com/a/79327/8761 , важливо зазначити, що хтось може завантажувати пакети Python, включаючи шкідливі, в PyPI.

Коротше кажучи, відповідно до принципом найменших привілеїв , не використовуйте sudoз pipдля установки пакетів Python з PyPI , якщо ви абсолютно не потрібно. Замість цього, подумайте про використання pip install --user(зауважте, що pip installбез sudoдодаткових прапорів / параметрів за замовчуванням pip install --userна Ubuntu в даний час) або віртуальних середовищ (таких як virtualenv). Якщо ви бачите, як люди рекомендують sudo pipабо sudo -H pip, будь ласка, скажіть їм, що їх не роблять.


2
Якщо я використовував його в минулому, як я очищую те, що робив?
ендоліт

1
Отже ці інструкції неправильні? tensorflow.org/install/install_linux
ендоліти

5
@endolith ви можете скасувати видалення файлу для скасування. Однак, якщо пакет отриманий від надійного технічного обслуговування, такого як tensorflow, numpy тощо, "aye! Security!" аргумент насправді не має сенсу. (Крім того, якщо ви встановлюєте будь-який зловмисний пакет, навіть як "--user", ви в основному все-таки накрутили. Справжнє правило повинно бути: Не встановлюйте код від невідомих / недовірених людей ... крім випадків, якщо в контейнері - але навіть тоді, не рекомендується.)
michael

2
@endolith Ці інструкції не кажуть використовувати sudo. Може, вони звикли і вони бачили помилку своїх шляхів? :)
Девід Гарднер

1
sudo pip installможе видалити "старі" встановлені системою пакети Python, що може ускладнити оновлення або видалення цих пакетів ОС. sudo pip uninstallТут не допомагає, оскільки він видаляє новий пакет, але не відновлює файли зі старого. (Мій колега Р. Загар детальніше описується в іншій відповіді.)
Майк Десимоне,

19

Ви повинні використовувати sudoдля установки pip з apt ( sudo apt install python-pip), але як зазначено у відповіді edwinksl, ви не повинні використовувати sudoдля встановлення пакетів з pip , ви повинні використовувати pip install --user <package>для встановлення лише для свого користувача або використовувати virtualenv щоб ще більше обмежити обсяг пакету .

Apt встановлює пакети з сховищ Ubuntu, тоді як pip встановлює завантажені користувачем пакети з PyPi, які можуть бути шкідливими.


7

І для більш загартованої відповіді:

  1. Ви дійсно завжди повинні це робити sudo apt-get install ..., саме так інструмент був розроблений для роботи.
  2. Використовувати за sudo [-H]допомогою pip installможливо і необов'язково, залежно від того, що саме ви хочете зробити (і, отже, "суперечка").

Один з девізів мови Python є «Там повинно бути одно-- і переважно тільки один --obvious спосіб зробити це.» І, як і більшість девізів, він порушений сардонічним виглядом, мабуть, при кожній можливій нагоді. (Тому я думаю, що девізи існують.) На жаль, на мою найбільш скромну думку, екосистема Python складається з безлічі суперечливих "жорстких і швидких" правил, які ніколи не будуть порушені ... крім випадків, коли "yada yada yada" (чорт, деталі тощо). Майже у всіх випадках це пов’язано з історичною еволюцією мови та інструментів (а хто хоче / потребує уроку історії, коли вони просто хочуть займатися своєю роботою) - але також може бути пов'язаний з відмінностями в Mac / Win / * Платформи Nix (наприклад, Unix / Linux має подібний менталітет,прийміть усі ці "порушені практики" та "по суті неправильні" вантажо-культисти з величезною щіпкою солі. Деякі насправді добре означають. (Інші - просто, ну, середньо.)

Перш за все, замість базових "встановлень на кожного користувача", ви майже завжди віддасте перевагу virtualenv, адже справді, це, мабуть, те, що вам в кінцевому підсумку потрібно. Тож ви можете також почати з цього зараз. Як це робиться, саме, "залежить" (див. Девіз Python, вище). Якщо ви використовуєте Conda (переважно для Mac і Windows), вона буде налаштована за допомогою Conda . Якщо ви використовуєте "чистий" Python [sic] , це залежить від того, яка версія та які утиліти python у вас є, але virtualenvwrapper досить зручно.

По-друге, ви можете віддати перевагу тому sudo -H pip install -U numpy, що є протилежним прикладом правилу "ніколи не судо" , що є прекрасним, навіть вигідним, тому що це дозволяє уникнути завантаження / перевстановлення / обслуговування великих бібліотек, де ви хочете лише / потрібна одна версія, у кожній віртуаленті окремо. Великі, популярні рамки, такі як scikit-learn, NumPy, matplotlib, SciPy, панди тощо, можуть бути встановлені один раз і виконані та повторно використані в різних середовищах . Крім того, ваш місцевий дружній системний адміністратор може мати змогу встановити їх для кожного користувача в системі - і, очевидно, вони могли б це зробити sudo, як, наприклад, для більш складних установок, таких як TensorFlow.

І, нарешті, якщо ви встановлюєте якусь випадкову сторонню бібліотеку, яка робить таке-таке (API API, змінення тексту, форматування коду тощо), я цілком згоден - не встановлюйте його як root через sudo. Звичайно, встановіть його як свого поточного користувача. Але пам’ятайте лише, у вашому обліковому записі користувача є всі ваші дійсно важливі речі .


2
Де "загартований" = "контрпродуктивний рукостискання з фальсифікацією рук із запрошенням плутанини заради того, щоб намагатися не зашкодити почуттям кого-небудь". Просто будьте чіткими і чіткими, щоб уникнути плутанини: ніколи не потрібно робити це як базовий рівень, включаючи ваші приклади. Unix - це справді "розкачайте власну конфігурацію та ризики", це буквально настрій C, але як там, не використовуйте mallocтам, де вам не потрібно. --userПрапор робить те , що ОП просили і не вимагає ніяких спеціальних дозволів. Ви підриваєте ваші добрі моменти щодо віртуаленв у процесі ... нічого "вантажно-культового" ні про що з цього.
Бенджамін Р

Я вже включив цю точку зору у своє опитування загальних відповідей та думок (якщо читати уважно).
Майкл

1

Використовуючи "sudo pip install", ви зможете замінити вміст python, наданий постачальником операційної системи. Коли це станеться, будь-які пакунки постачальників, постраждалих від цього, не пройдуть "rpm - підтвердити", і ваші пакунки виявляться пошкодженими.

Ви хочете використовувати інструменти системного адміністрування, які перевірив ваш постачальник ОС , чи добре використовувати неперевірені компоненти, завантажені з Інтернету?

Коли, якщо не, зловмисний пакет завантажується на PyPI ... люди, які використовують "sudo pip install", в кінцевому підсумку запустять цей зловмисний корисний набір з повними привілеями системи. Ви цього хочете? (# принциповий привілей)

Якщо це лише ваш ноутбук, і ви ризикуєте лише кількома зображеннями котів, ризик, ймовірно, низький ... але якщо це багатокористувацька система, ризик зараз множиться на N. Якщо у вас є дані про система, яка має цінність, або доступність або надійність системи мають значення, тоді ризики також збільшуються.

Будь ласка, не соромтеся вибирати власну пригоду, але будь ласка, отримайте усвідомлену згоду інших користувачів, на які може вплинути ваш вибір. Вони можуть бути не комфортні з таким же рівнем ризику, як і ви.


0

Щоб додати до цих відповідей: Я не знаю про Ubuntu, але у Fedora я можу використовувати sudo dnf install python3-numpyформат для встановлення МНОГО корисних мені пакетів. Це не має недоліків бути незахищеним (дистриб'ютор репо репортажу має затверджені пакети), але також дозволяє встановлювати на всій системі. Єдиним недоліком є ​​те, що версії distro repo можуть дещо відставати від пакетів у PyPI.


-1

Ні, це правильно. Я не можу підтвердити цю претензію. Я завжди використовую sudo -Hз pip. pipможе завдати шкоди лише файлам операційної системи apt. Тільки не використовуйте sudoз , pipколи ви хочете встановити тільки для цього користувача.


1
Коли на вашому персональному комп’ютері потрібно встановлювати загальносистемну pipсистему? Якщо ви сисадмін, можливо, це вже інша історія.
Бенджамін Р
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.