Là `sudo pip install` vẫn là một thực tế bị hỏng?


38

Tôi mới sử dụng Ubuntu, vì vậy hãy đồng ý với tôi. Tôi đã cài đặt pipbằng lệnh này : sudo apt-get -y install python-pip. Sau đó, tôi đã cài đặt NLTK bằng cách sử dụng lệnh trên trang web của họ, đó là : sudo pip install -U nltk. Nhưng sau đó tôi vấp phải câu hỏi này nói rằng tất cả những gì tôi làm là một "thực hành bị hỏng". Điều gây ấn tượng nhất với tôi là việc sử dụng sudo pipvốn đã sai và việc cho pipquá nhiều lực có thể làm hỏng các tệp hệ điều hành. Bất cứ ai có thể xác nhận yêu cầu này?

Lưu ý - Tôi chỉ sử dụng sudovì khi tôi thử lệnh, apt-get -y install python-pipnó đã cho tôi 2 lỗi:

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
Hướng dẫn nói sudo pip installvốn đã sai. - từ stackoverflow.com/a/33004920/95735
Piotr Dobrogost

"... vốn dĩ ...." pshaw
michael

Xin lỗi, sudo pip installlà xấu như curl "some-url" | sudo bashcài đặt. Tương tự, chúng tôi đã có một vài lần sử dụng một số nhà phát triển sudo pip installđể cài đặt một số phụ thuộc vào máy trạm của họ, sau đó kiểm tra mã bị hỏng cho repo vì tệp requirements.txthoặc setup.pybị thiếu bất cứ thứ gì họ cài đặt và mọi người khác phải tìm ra sự phụ thuộc nào là cần thiết Trong khi chàng trai đang đi nghỉ.
Mike DeSimone

Câu trả lời:


52

Cả hai sudo pip installvà biến thể phổ biến khác của nó khôngsudo -H pip install nên được khuyến khích vì việc sử dụng các đặc quyền gốc để sử dụng để cài đặt các gói Python từ PyPI (Chỉ số gói Python) là một rủi ro bảo mật .pip

Từ https://stackoverflow.com/a/21056000/486919 (nhấn mạnh của tôi):

Khi bạn chạy pipvới sudo, bạn chạy setup.pyvới sudo. Nói cách khác, bạn chạy mã Python tùy ý từ Internet dưới dạng root. Nếu ai đó đưa ra một dự án độc hại trên PyPI và bạn cài đặt nó, bạn cấp quyền truy cập root cho kẻ tấn công vào máy của bạn. Trước một số bản sửa lỗi gần đây pipvà PyPI, kẻ tấn công cũng có thể điều khiển một người đàn ông trong cuộc tấn công giữa để tiêm mã của họ khi bạn tải xuống một dự án đáng tin cậy.

Như đã đề cập tại https://security.stackexchange.com/a/79327/8761 , điều quan trọng cần lưu ý là bất kỳ ai cũng có thể tải lên các gói Python, bao gồm cả các gói độc hại, lên PyPI.

Nói tóm lại, phù hợp với các nguyên tắc đặc quyền tối thiểu , không sử dụng sudovới pipcài đặt các gói Python từ PyPI trừ khi bạn hoàn toàn cần đến. Thay vào đó, hãy cân nhắc sử dụng pip install --user(lưu ý rằng hiện pip installtại không có sudocờ / tùy chọn bổ sung nào mặc định pip install --usertrên Ubuntu) hoặc môi trường ảo (chẳng hạn như virtualenv). Nếu bạn thấy mọi người giới thiệu sudo piphoặc sudo -H pip, xin vui lòng nói với họ là không.


2
Nếu tôi đã sử dụng nó trong quá khứ, làm thế nào để tôi làm sạch những gì nó đã làm?
endolith

1
Vậy những chỉ dẫn này có sai không? tenorflow.org/install/install_linux
endolith

5
@endolith bạn có thể sudo gỡ cài đặt pip để hoàn tác. Ngoài ra, mặc dù, nếu gói là từ một nhà bảo trì đáng tin cậy, chẳng hạn như tenorflow, numpy, v.v., thì "aye! Security!" tranh luận không thực sự có ý nghĩa. . ngay cả sau đó, không được đề xuất.)
michael

2
@endolith Những hướng dẫn không nói sử dụng sudo. Có lẽ họ đã từng và họ đã thấy lỗi theo cách của họ? :)
David Gardner

1
sudo pip installcó thể gỡ cài đặt các gói Python "cũ" được cài đặt hệ thống, điều này có thể khiến việc nâng cấp hoặc gỡ cài đặt các gói hệ điều hành đó trở nên khó khăn. sudo pip uninstallkhông giúp đỡ ở đây, vì nó loại bỏ gói mới nhưng không khôi phục các tệp từ gói cũ. (Đồng nghiệp của tôi R. Zagar đi vào chi tiết hơn trong câu trả lời khác.)
Mike DeSimone

19

Bạn phải sử dụng sudođể cài đặt pip với apt ( sudo apt install python-pip), nhưng như đã nêu trong câu trả lời của edwinksl, bạn không nên sử dụng sudođể cài đặt các gói với pip , bạn chỉ nên sử dụng pip install --user <package>để cài đặt cho người dùng của mình hoặc sử dụng virtualenv để hạn chế hơn nữa phạm vi của gói .

Apt cài đặt các gói từ kho của Ubuntu, trong khi pip cài đặt các gói do người dùng tải lên từ PyPi có thể độc hại.


7

Và để trả lời bình tĩnh hơn:

  1. Bạn thực sự luôn phải làm thế sudo apt-get install ..., đó chỉ là cách công cụ được thiết kế để hoạt động.
  2. Sử dụng sudo [-H]với pip installcả hai đều có thể và tùy chọn, tùy thuộc vào chính xác những gì bạn muốn làm (và do đó, "tranh cãi").

Một trong những phương châm của Python"Nên có một-- và tốt nhất là chỉ có một cách rõ ràng để làm điều đó." Và giống như hầu hết các phương châm, nó bị phá vỡ với niềm vui thích mỉa mai dường như ở mọi cơ hội có thể. (Đó là lý do tại sao phương châm tồn tại, tôi đoán.) Thật không may, theo ý kiến khiêm tốn nhất của tôi, các hệ sinh thái Python gồm nhiều mâu thuẫn "cứng & nhanh" quy tắc, không bao giờ bị phá vỡ ... trừ khi "yada yada yada" (ma quỷ, chi tiết, v.v.) Trong hầu hết các trường hợp, điều này là do sự phát triển lịch sử của ngôn ngữ & công cụ (và ai muốn / cần một bài học lịch sử khi họ chỉ muốn tiếp tục với công việc của họ) - nhưng cũng có thể là do sự khác biệt trong Mac / Win / * Nền tảng Nix (ví dụ: Unix / Linux có tâm lý tương tự,hãy thực hiện tất cả những "người thực hành bị hỏng""sai lầm vốn có" - những người sùng bái hàng hóa với một nhúm muối khổng lồ. Một số thực sự có nghĩa là tốt. (Những người khác chỉ là, tốt, có nghĩa là.)

Trước hết, thay vì "cài đặt cho mỗi người dùng" cơ bản, hầu như bạn sẽ luôn thích một virtualenv, bởi vì thực sự, đó có lẽ là thứ bạn sẽ cần. Vì vậy, bạn cũng có thể bắt đầu với nó bây giờ. Làm thế nào điều này được thực hiện, chính xác, "phụ thuộc" (xem phương châm Python, ở trên). Nếu bạn đang sử dụng Conda (chủ yếu cho Mac & Windows), nó sẽ được thiết lập bằng Conda . Nếu sử dụng Python "thuần" [sic] , nó phụ thuộc vào phiên bản nào & bạn sử dụng python nào, nhưng virtualenvwrapper khá tiện dụng.

Thứ hai, giống như một ví dụ đối lập với quy tắc "không bao giờ sudo", bạn có thể thích sudo -H pip install -U numpy, điều này hoàn toàn tốt, thậm chí có lợi, ở chỗ nó có thể cho phép một người tránh tải xuống / cài đặt lại / duy trì các thư viện lớn, nơi bạn chỉ muốn / cần một phiên bản, vào mỗi virtualenv riêng biệt. Các khung lớn, phổ biến như scikit-learn, NumPy, matplotlib, SciPy, gấu trúc, v.v., có thể được cài đặt một lần & thực hiện và sử dụng lại trên các môi trường . Hơn nữa, quản trị viên hệ thống thân thiện tại địa phương của bạn có thể có thể cài đặt những cài đặt này cho mọi người dùng trên hệ thống - và rõ ràng họ cũng sẽ thực hiện việc này thông qua sudo, ví dụ, đối với các cài đặt phức tạp hơn, chẳng hạn như TensorFlow.

Và cuối cùng, nếu bạn đang cài đặt một thư viện bên thứ 3 ngẫu nhiên nào đó tương tự (API Twitter, munging văn bản, định dạng mã, v.v.), thì tôi hoàn toàn đồng ý - không cài đặt nó dưới dạng root thông qua sudo. Chắc chắn, cài đặt nó như người dùng hiện tại của bạn. Nhưng chỉ cần nhớ, tài khoản người dùng của bạn có tất cả những thứ thực sự quan trọng của bạn .


2
Trong đó "nóng nảy" = "vặn vẹo bàn tay phản tác dụng gây ra sự nhầm lẫn với mục đích cố gắng không làm tổn thương cảm xúc của bất cứ ai". Chỉ cần rõ ràng và rõ ràng để tránh nhầm lẫn: không bao giờ cần phải làm điều này như là một đường cơ sở, bao gồm các ví dụ của bạn. Unix thực sự là "cuộn cấu hình và rủi ro của riêng bạn", đó thực sự là một suy nghĩ C, nhưng cũng giống như ở đó, không sử dụng mallocở nơi bạn không cần. Các --userlá cờ làm những gì OP được yêu cầu và không yêu cầu quyền đặc biệt. Bạn đang làm suy yếu những điểm tốt của bạn về virtualenv trong quá trình ... không có gì là "nhà văn hóa hàng hóa" về bất kỳ điều gì trong số này.
Benjamin R

Tôi đã bao gồm quan điểm này trong khảo sát của tôi về các câu trả lời và ý kiến ​​chung (nếu ai đó đọc kỹ).
michael

1

Sử dụng "sudo pip install" có thể và sẽ ghi đè lên nội dung python do nhà cung cấp hệ điều hành của bạn cung cấp. Khi điều đó xảy ra, bất kỳ gói nhà cung cấp nào bị ảnh hưởng bởi điều này sẽ không vượt qua "vòng / phút - xác minh" và các gói của bạn sẽ xuất hiện bị hỏng.

Bạn có muốn sử dụng các công cụ quản trị hệ thống mà nhà cung cấp hệ điều hành của bạn đã thử nghiệm không , hoặc có thể sử dụng các thành phần chưa được kiểm tra mà bạn đã tải xuống từ internet không?

Khi, chứ không phải, nếu một gói độc hại được tải lên PyPI ... những người sử dụng "sudo pip install" sẽ kết thúc việc chạy tải trọng độc hại đó với các đặc quyền toàn hệ thống. Bạn có muốn điều đó? (#principlofleastpriv đặc biệt)

Nếu đó chỉ là máy tính xách tay của bạn và bạn chỉ mạo hiểm với một vài bức ảnh mèo, thì rủi ro có thể là thấp ... nhưng nếu đó là hệ thống nhiều người dùng, thì rủi ro bây giờ được nhân lên bởi N. Nếu bạn có dữ liệu về hệ thống có giá trị, hoặc hệ thống sẵn có hoặc độ tin cậy có giá trị, thì rủi ro cũng tăng lên.

Xin vui lòng chọn cuộc phiêu lưu của riêng bạn, nhưng xin vui lòng nhận được sự đồng ý của người dùng khác có thể bị ảnh hưởng bởi sự lựa chọn của bạn. Họ có thể không thoải mái với mức độ rủi ro như bạn.


0

Để thêm vào những câu trả lời này: Tôi không biết về Ubuntu, nhưng trên Fedora tôi có thể sử dụng sudo dnf install python3-numpyđịnh dạng để cài đặt NHIỀU gói hữu ích cho tôi. Điều này không có nhược điểm là không an toàn (bộ bảo trì repro có các gói được xác nhận), nhưng cũng cho phép bạn cài đặt toàn hệ thống. Hạn chế duy nhất là các phiên bản repo distro có thể bị trễ một chút các gói trong PyPI.


-1

Không, điều này là chính xác. Tôi không thể xác nhận yêu cầu này. Tôi luôn luôn sử dụng sudo -Hvới pip. pipchỉ có thể làm hỏng tập tin hệ điều hành nhiều như apt. Chỉ không sử dụng sudovới pipkhi bạn muốn cài đặt chỉ dành cho người dùng đó.


1
Trên máy tính cá nhân của bạn, khi nào bạn cần cài đặt toàn piphệ thống? Nếu bạn là một sysadmin, có lẽ đó là một câu chuyện khác.
Benjamin R
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.