एक टूटी हुई प्रथा है?


38

मैं उबंटू में नया हूं, इसलिए कृपया मेरे साथ रहें। मैंने pipइस कमांड का उपयोग करके स्थापित किया है sudo apt-get -y install python-pip:। तब मैंने एनएलटीके को उनकी वेबसाइट पर कमांड का उपयोग करके स्थापित किया , जो था 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को प्रोत्साहित नहीं किया जाना चाहिए क्योंकि यह pipPyPI (Python Package Index) से Python पैकेजों को स्थापित करने के लिए उपयोग करने के लिए रूट विशेषाधिकारों का उपयोग करने के लिए सुरक्षा जोखिम है ।

से https://stackoverflow.com/a/21056000/486919 (जोर मेरा):

जब आप pipसाथ दौड़ते हैं sudo, तो आप setup.pyसाथ दौड़ते हैं sudo। दूसरे शब्दों में, आप रूट के रूप में इंटरनेट से मनमाना पायथन कोड चलाते हैं। यदि कोई PyPI पर कोई दुर्भावनापूर्ण प्रोजेक्ट लगाता है और आप इसे स्थापित करते हैं, तो आप अपनी मशीन पर एक हमलावर रूट एक्सेस देते हैं। pipजब आप किसी भरोसेमंद प्रोजेक्ट को डाउनलोड करते हैं, तो हाल ही में किए गए कुछ सुधारों और PyPI से पहले, एक हमलावर अपने कोड को इंजेक्ट करने के लिए बीच के हमले में एक आदमी को भी चला सकता था।

जैसा कि https://security.stackexchange.com/a/79327/8761 में उल्लेख किया गया है , यह ध्यान रखना महत्वपूर्ण है कि कोई भी Python संकुल को दुर्भावनापूर्ण सहित PyPI में अपलोड कर सकता है।

संक्षेप में, के अनुसार कम से कम विशेषाधिकार के सिद्धांत का उपयोग नहीं करते sudoके साथ pipPyPI से अजगर पैकेज इंस्टॉल करने जब तक आप पूरी तरह से की जरूरत है। इसके बजाय, उपयोग पर विचार करें pip install --user(ध्यान दें कि उबंटू में वर्तमान में pip installकोई sudoअतिरिक्त या झंडे / विकल्प नहीं हैं pip install --user) या वर्चुअल वातावरण (जैसे virtualenv)। यदि आप लोगों को सलाह देते हैं sudo pipया sudo -H pip, कृपया उन्हें बताएं कि नहीं।


2
अगर मैंने इसे अतीत में इस्तेमाल किया है, तो मैंने इसे कैसे साफ किया?
एंडोलिथ

1
तो ये निर्देश गलत हैं? Tenorflow.org/install/install_linux
endolith

5
@endolith आप पाइप को पूर्ववत करने के लिए अनइंस्टॉल कर सकते हैं। इसके अलावा, हालांकि, अगर पैकेज एक विश्वसनीय अनुरक्षक से है, जैसे टेंसोफ़्लो, सुन्न, आदि, "ऐ-सुरक्षा!" तर्क वास्तव में कोई मतलब नहीं है। (इसके अलावा, यदि आप किसी भी दुर्भावनापूर्ण पैकेज को, यहां तक ​​कि "--user" के रूप में स्थापित करते हैं, तो आप मूल रूप से वैसे भी खराब हो जाते हैं। असली नियम यह होना चाहिए: अज्ञात / असत्य लोगों से कोड स्थापित न करें ... सिवाय एक कंटेनर में - लेकिन फिर भी, अनुशंसित नहीं है।)
माइकल

2
@endolith वे निर्देश जो sudo का उपयोग करने के लिए नहीं कहते हैं। शायद वे करते थे और उन्होंने अपने तरीके की त्रुटि देखी है? :)
डेविड गार्डनर

1
sudo pip install"पुराने" सिस्टम-इंस्टॉल किए गए पायथन पैकेजों की स्थापना रद्द कर सकते हैं, जो उन ओएस पैकेजों को अपग्रेड या अनइंस्टॉल कर सकते हैं। sudo pip uninstallयहाँ मदद नहीं करता है, क्योंकि यह नए पैकेज को हटा देता है लेकिन पुराने से फ़ाइलों को पुनर्स्थापित नहीं करता है। (मेरे सहयोगी आर। ज़ागर एक और जवाब में और अधिक विस्तार में जाते हैं।)
माइक डीसमोन

19

आप का उपयोग करना चाहिए sudoपिप स्थापित करने के लिए उपयुक्त के साथ ( sudo apt install python-pip), लेकिन जैसा कि में कहा गया है edwinksl का जवाब आप उपयोग नहीं करना चाहिए sudoपैकेज इंस्टॉल करने पिप के साथ , आप का उपयोग करना चाहिए pip install --user <package>अपने उपयोगकर्ता के लिए केवल स्थापित करें, या एक का उपयोग करने के virtualenv आगे भी पैकेज के दायरे को सीमित करने के ।

Apt उबंटू के रिपॉजिटरी से पैकेज स्थापित करता है, जबकि पाइप PyPi से उपयोगकर्ता द्वारा अपलोड किए गए पैकेज इंस्टॉल करता है जो दुर्भावनापूर्ण हो सकता है।


7

और अधिक गुस्सा जवाब के लिए:

  1. आपको वास्तव में हमेशा ऐसा करना पड़ता है sudo apt-get install ..., बस यही उपकरण काम करने के लिए डिज़ाइन किया गया था।
  2. के sudo [-H]साथ प्रयोग करना pip installसंभव और वैकल्पिक दोनों है, इस पर निर्भर करता है कि आप वास्तव में क्या करना चाहते हैं (और इसलिए, "विवाद")।

में से एक अजगर के मोटो है "वहाँ one-- हो सकता है और अधिमानतः केवल एक --obvious यह करने के लिए जिस तरह से करना चाहिए।" और अधिकांश मोटोस की तरह, यह हर संभव अवसर पर सरसोनिक उल्लास के साथ टूट जाता है। (यही कारण है कि मोटोस मौजूद है, मुझे लगता है।) दुर्भाग्य से, मेरी सबसे विनम्र राय में, पायथन इकोसिस्टम में कई परस्पर विरोधी "कठिन और तेज़" नियम शामिल हैं, कभी भी टूटना नहीं चाहिए ... सिवाय इसके जब "यदा यदा यदा" (शैतान,) विवरण, आदि)। लगभग सभी मामलों में, यह भाषा और औजारों के ऐतिहासिक विकास के कारण है (और जो तब चाहते हैं / जब उन्हें अपनी नौकरी के साथ काम करना हो) एक इतिहास सबक की जरूरत है - लेकिन मैक / विन / में अंतर के कारण भी हो सकता है / * निक्स प्लेटफॉर्म (जैसे, यूनिक्स / लिनक्स में एक समान मानसिकता है,)नमक के एक विशाल चुटकी के साथ इन सभी "टूटी हुई प्रथा" और "स्वाभाविक रूप से गलत" कार्गो-कृषक को लें। कुछ वास्तव में अच्छी तरह से मतलब है। (अन्य लोग बस, ठीक हैं, मतलब है।)

सबसे पहले, बुनियादी "प्रति-उपयोगकर्ता इंस्टॉल" के बजाय, आप लगभग हमेशा एक वर्चुअनव को पसंद करेंगे, क्योंकि वास्तव में, शायद यही वह है जो आप की आवश्यकता को समाप्त करेंगे। तो आप भी अब इसके साथ शुरू कर सकते हैं। यह कैसे किया जाता है, बिल्कुल, "निर्भर करता है" (पायथन आदर्श वाक्य देखें, ऊपर)। यदि आप Conda (ज्यादातर Mac & Windows के लिए) का उपयोग कर रहे हैं, तो इसे Conda का उपयोग करके सेट किया जाएगा । यदि "शुद्ध" पायथन [sic] का उपयोग किया जाता है , तो यह इस बात पर निर्भर करता है कि आपके पास कौन से संस्करण और क्या अजगर हैं, लेकिन virtualenvwrapper बहुत काम का है।

दूसरा, बस "कभी नहीं सूदो" नियम के प्रति-उदाहरण के रूप में, आप पसंद कर सकते हैं sudo -H pip install -U numpy, जो पूरी तरह से ठीक है, यहां तक ​​कि लाभप्रद भी है, जिसमें यह एक को बड़े पुस्तकालयों को डाउनलोड करने / पुन: स्थापित / बनाए रखने से बचने की अनुमति दे सकता है, जहां आप केवल / चाहते हैं हर वर्चुअन में अलग से एक संस्करण की जरूरत है। स्किकिट-लर्न, न्यूपी, मैटप्लोटलिब, साइपीपी, पांडा, आदि जैसे बड़े, लोकप्रिय ढांचे को एक बार स्थापित किया जा सकता है और पूरे वातावरण में फिर से उपयोग किया जा सकता है । इसके अलावा, आपके स्थानीय मैत्रीपूर्ण sys-admin सिस्टम पर प्रत्येक उपयोगकर्ता के लिए ये स्थापित करने में सक्षम हो सकते हैं - और जाहिर है कि वे इसके माध्यम से sudoऔर अधिक जटिल इंस्टॉलेशन जैसे कि TensorFlow के माध्यम से कर रहे हैं ।

और, अंत में, यदि आप कुछ रैंडम 3 पार्टी लाइब्रेरी स्थापित कर रहे हैं जो इस तरह के और (जैसे ट्विटर एपीआई, टेक्स्ट मूंगिंग, कोड फॉर्मेटिंग आदि) करती है, तो मैं पूरी तरह से सहमत हूं - इसे sudo के माध्यम से रूट के रूप में स्थापित न करें। ज़रूर, इसे अपने वर्तमान उपयोगकर्ता के रूप में स्थापित करें। लेकिन बस याद रखें, आपके उपयोगकर्ता खाते में आपके सभी महत्वपूर्ण सामान हैं


2
जहाँ "टेम्पर्ड" = "किसी के भावनाओं को आहत न करने की कोशिश के लिए उल्टे हाथ-पैर मारने वाला भ्रामक आमंत्रण भ्रम पैदा करता है"। भ्रम से बचने के लिए बस स्पष्ट और स्पष्ट रहें: आपके उदाहरण सहित, बेसलाइन के रूप में ऐसा करने की कोई आवश्यकता नहीं है। यूनिक्स वास्तव में "अपने स्वयं के कॉन्फ़िगरेशन और जोखिमों को रोल करें", यह सचमुच सी मानसिकता है, लेकिन वहां की तरह, वहां उपयोग न करें mallocजहां आपको ज़रूरत नहीं है। --userझंडा क्या ओ पी के लिए पूछ रहा था करता है और किसी विशेष अनुमति की आवश्यकता है। आप इस प्रक्रिया में virtualenv के बारे में अपने अच्छे बिंदुओं को कम कर रहे हैं ... इस में से किसी के बारे में "कार्गो-कल्चर" कुछ भी नहीं।
बेंजामिन R

मैंने पहले ही आम प्रतिक्रियाओं और राय के अपने सर्वेक्षण में इस परिप्रेक्ष्य को शामिल किया (यदि कोई बारीकी से पढ़ता है)।
माइकल

1

"Sudo pip install" का उपयोग करके आपके OS विक्रेता द्वारा प्रदत्त अजगर सामग्री को अधिलेखित कर देगा। जब ऐसा होता है, तो इससे प्रभावित कोई भी विक्रेता पैकेज "rpm --verify" पास नहीं करेगा और आपके पैकेज दूषित हो जाएंगे।

क्या आप सिस्टम-एडमिनिस्ट्रेशन टूल का उपयोग करना चाहते हैं जिसे आपके ओएस विक्रेता ने परीक्षण किया है , या क्या आपके द्वारा इंटरनेट से डाउनलोड किए गए अप्रयुक्त घटकों का उपयोग करना ठीक है?

जब, यदि नहीं, तो एक दुर्भावनापूर्ण पैकेज PyPI पर अपलोड हो जाता है ... जो लोग "sudo pip install" का उपयोग करते हैं, वे उस दुर्भावनापूर्ण पेलोड को पूरे सिस्टम विशेषाधिकारों के साथ समाप्त कर देंगे। क्या आपको वो चाहिए? (#Principleofleastprivilege)

यदि यह सिर्फ आपका लैपटॉप है, और आप केवल कुछ बिल्ली के चित्रों को जोखिम में डाल रहे हैं, तो जोखिम शायद कम है ... लेकिन अगर यह एक बहु-उपयोगकर्ता प्रणाली है, तो जोखिम अब एन द्वारा गुणा किया जाता है। यदि आपके पास डेटा है सिस्टम जिसमें मूल्य है, या सिस्टम की उपलब्धता या विश्वसनीयता का मूल्य है, तो जोखिम भी बढ़ जाते हैं।

कृपया अपने स्वयं के रोमांच का चयन करने के लिए स्वतंत्र महसूस करें, लेकिन कृपया उन अन्य उपयोगकर्ताओं की सूचित सहमति प्राप्त करें जो आपकी पसंद से प्रभावित हो सकते हैं। वे आपके समान जोखिम के स्तर के साथ सहज नहीं हो सकते हैं।


0

इन उत्तरों को जोड़ने के लिए: मुझे उबंटू के बारे में नहीं पता है, लेकिन फेडोरा पर मैं मैनी पैकेजों को मेरे लिए उपयोगी sudo dnf install python3-numpyस्थापित करने के लिए प्रारूप का उपयोग करने में सक्षम हूं। यह असुरक्षित होने का नुकसान नहीं है (डिस्ट्रो रेपो मेंटेनर के पास वैध पैकेज हैं), लेकिन यह आपको सिस्टम-वाइड स्थापित करने की अनुमति भी देता है। केवल दोष यह है कि डिस्ट्रो रेपो वर्जन PyPI में पैकेज को थोड़ा पिछड़ सकता है।


-1

नहीं, यह सही है। मैं इस दावे को मान्य नहीं कर सकता। मैं हमेशा के sudo -Hसाथ उपयोग करते हैं pippipकेवल ऑपरेटिंग सिस्टम फ़ाइलों को ही नुकसान पहुंचा सकता है apt। केवल का उपयोग नहीं करते sudoके साथ pipजब आप उस उपयोगकर्ता के लिए केवल स्थापित करना चाहते हैं।


1
आपके व्यक्तिगत कंप्यूटर पर, आपको pipसिस्टम-वाइड स्थापित करने की आवश्यकता कब होती है? यदि आप एक sysadmin रहे हैं, शायद यह एक अलग कहानी है।
बेंजामिन R
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.