`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
Piotr Dobrogost

"... โดยเนื้อแท้ .... " pshaw
michael

ขออภัยsudo pip installมันไม่ดีเท่ากับการcurl "some-url" | sudo bashติดตั้ง ในทำนองเดียวกันเรามีสองสามครั้งที่นักพัฒนาซอฟต์แวร์บางคนเคยsudo pip installติดตั้งการพึ่งพาบางอย่างบนเวิร์กสเตชันของพวกเขาแล้วตรวจสอบในรหัสที่ขาดไป repo เพราะrequirements.txtหรือsetup.pyไฟล์หายไปสิ่งที่พวกเขาติดตั้งและทุกคนก็ต้องคิดว่าการพึ่งพา ในขณะที่ผู้ชายคนนั้นกำลังพักผ่อน
Mike DeSimone

คำตอบ:


52

ไม่ควรสนับสนุนทั้งคู่sudo pip installและตัวแปรทั่วไปอื่น ๆเนื่องจากเป็นความเสี่ยงด้านความปลอดภัยในการใช้สิทธิ์รูทเพื่อใช้ในการติดตั้งแพ็กเกจ Python จาก PyPI (Python Package Index)sudo -H pip installpip

จาก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
หากฉันเคยใช้มาก่อนฉันจะล้างสิ่งที่ทำไปได้อย่างไร
endolith

1
ดังนั้นคำแนะนำเหล่านี้ผิดหรือเปล่า? tensorflow.org/install/install_linux
endolith

5
@endolith คุณสามารถ sudo ถอนการติดตั้ง pip เพื่อเลิกทำ อย่างไรก็ตามหากแพ็คเกจนั้นมาจากผู้ดูแลที่เชื่อถือได้เช่น tenorflow, numpy, etc "aye! security!" การโต้แย้งไม่สมเหตุสมผล (เช่นถ้าคุณติดตั้งแพคเกจที่เป็นอันตรายใด ๆ เช่นเดียวกับ "--user" คุณจะถูกเมาโดยทั่วไปกฎที่แท้จริงควรเป็น: อย่าติดตั้งรหัสจากคนที่ไม่รู้จัก / ไม่น่าเชื่อถือ ... ยกเว้นในภาชนะ - แต่ ถึงแม้จะไม่แนะนำก็ตาม)
ไมเคิล

2
@endolith คำแนะนำเหล่านั้นไม่ได้บอกว่าจะใช้ sudo บางทีพวกเขาเคยชินและพวกเขาเคยเห็นข้อผิดพลาดของวิธีการของพวกเขา? :)
David Gardner

1
sudo pip installสามารถถอนการติดตั้งแพคเกจ Python ที่ติดตั้งระบบ "เก่า" ซึ่งสามารถทำให้การอัพเกรดหรือถอนการติดตั้งแพ็กเกจระบบปฏิบัติการเหล่านั้นเป็นเรื่องยาก sudo pip uninstallไม่ได้ช่วยที่นี่เพราะมันลบแพคเกจใหม่ แต่ไม่ได้เรียกคืนไฟล์จากไฟล์เก่า (เพื่อนร่วมงานของฉัน R. Zagar อธิบายรายละเอียดเพิ่มเติมในคำตอบอื่น)
Mike DeSimone

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คือ"ควรมีอย่างใดอย่างหนึ่ง - และดีกว่าเพียงหนึ่ง - วิธีชัดเจนที่จะทำ." และเช่นเดียวกับคติประจำใจส่วนใหญ่มันจะทำลายด้วยความสนุกสนานที่ดูน่ากลัวในทุกโอกาสที่เป็นไปได้ (นั่นเป็นเหตุผลว่าทำไมถึงมีคติพจน์อยู่ฉันคิดว่าน่าเสียดาย) ในความเห็นต่ำต้อยที่สุดของฉันระบบนิเวศของ Python ประกอบด้วยกฎ "ยากและเร็ว" ที่ขัดแย้งกันมากมายไม่เคยถูกทำลาย ... ยกเว้นเมื่อ "yada yada yada" (ปีศาจ รายละเอียดอื่น ๆ ) ในเกือบทุกกรณีนี่เป็นเพราะวิวัฒนาการทางประวัติศาสตร์ของภาษาและเครื่องมือ (และผู้ที่ต้องการ / ต้องการบทเรียนประวัติศาสตร์เมื่อพวกเขาต้องการทำงานกับพวกเขา) - แต่อาจเกิดจากความแตกต่างใน Mac / Win / * แพลตฟอร์ม Nix (เช่น Unix / Linux มีความคิดคล้ายกันใช้"การฝึกฝนที่ผิดพลาด" & "ผิด" โดยกำเนิด "ผู้ขนส่งสินค้าด้วยเกลือจำนวนมาก บางคนทำดีจริง ๆ (อื่น ๆ เป็นเพียงดีหมายถึง.)

ก่อนอื่นแทนที่จะติดตั้ง "ต่อผู้ใช้ขั้นพื้นฐาน" คุณจะชอบ virtualenv อยู่เสมอเพราะจริงๆแล้วนั่นอาจเป็นสิ่งที่คุณต้องการ ดังนั้นคุณอาจเริ่มจากตอนนี้ วิธีการนี้จะเสร็จสิ้นตรงตาม "ขึ้น" (ดูคำขวัญ Python ด้านบน) หากคุณกำลังใช้ Conda (ส่วนใหญ่สำหรับ Mac และ Windows) ก็จะถูกกำหนดขึ้นโดยใช้ Conda หากใช้ Python "บริสุทธิ์" [sic]มันขึ้นอยู่กับเวอร์ชันและไพ ธ อนใดที่คุณมี แต่virtualenvwrapperนั้นค่อนข้างมีประโยชน์

ประการที่สองเช่นเดียวกับตัวอย่างของกฎ "ไม่เคย sudo" คุณอาจต้องการsudo -H pip install -U numpyซึ่งดีอย่างสมบูรณ์แม้ประโยชน์ในการที่มันสามารถอนุญาตให้หนึ่งเพื่อหลีกเลี่ยงการดาวน์โหลด / ติดตั้งใหม่ / การบำรุงรักษาห้องสมุดขนาดใหญ่ที่คุณต้องการ / ต้องการหนึ่งเวอร์ชันใน virtualenv ทุกอันแยกกัน กรอบใหญ่ยอดนิยมเช่น scikit-learning, NumPy, matplotlib, SciPy, pandas เป็นต้นสามารถติดตั้งได้ทันที & เสร็จสิ้นและนำกลับมาใช้ใหม่ในสภาพแวดล้อมต่างๆ นอกจากนี้ผู้ดูแลระบบ sys-admin ที่เป็นมิตรของคุณอาจสามารถทำการติดตั้งเหล่านี้ให้กับผู้ใช้ทุกคนในระบบและแน่นอนว่าพวกเขาจะทำสิ่งนี้ผ่านsudoเช่นกันเช่นสำหรับการติดตั้งที่ซับซ้อนมากขึ้นเช่น TensorFlow

และท้ายที่สุดถ้าคุณติดตั้งไลบรารี่ของบุคคลที่สามซึ่งทำเช่นนั้น (Twitter API, ข้อความผิดพลาด, การจัดรูปแบบโค้ด ฯลฯ ) ฉันก็เห็นด้วยอย่างยิ่ง - อย่าติดตั้งมันเป็นรูทผ่าน sudo แน่นอนว่าติดตั้งเป็นผู้ใช้ปัจจุบันของคุณ แต่จำไว้ว่าคุณใช้บัญชีมีทุกสิ่งที่สำคัญจริงๆของคุณ


2
โดยที่ "tempered" = "faffing ต่อต้านมือที่เชิญชวนสับสนเพื่อผลประโยชน์ของความพยายามที่จะไม่ทำร้ายความรู้สึกของใคร" ชัดเจนและชัดเจนเพื่อหลีกเลี่ยงความสับสน: ไม่จำเป็นต้องทำเช่นนี้เป็นพื้นฐานรวมถึงตัวอย่างของคุณ Unix นั้นแน่นอน "ทำให้การกำหนดค่าและความเสี่ยงของคุณ" เป็นความคิด C จริงๆ แต่อย่างนั้นอย่าใช้ในmallocที่ที่คุณไม่ต้องการ การ--userตั้งค่าสถานะทำตามที่ OP ร้องขอและไม่ต้องการการอนุญาตพิเศษ คุณกำลังบ่อนทำลายจุดดีของคุณเกี่ยวกับvirtualenvในกระบวนการ ... ไม่มีอะไร "Cargo-cultist" เกี่ยวกับสิ่งนี้
Benjamin R

ฉันได้รวมมุมมองนี้ไว้ในแบบสำรวจการตอบสนองและความคิดเห็นทั่วไปแล้ว (ถ้ามีคนอ่านอย่างใกล้ชิด)
ไมเคิล

1

การใช้ "sudo pip install" สามารถและจะเขียนทับเนื้อหาหลามที่จัดทำโดยผู้จำหน่ายระบบปฏิบัติการของคุณ เมื่อสิ่งนั้นเกิดขึ้นแพ็คเกจของผู้ขายที่ได้รับผลกระทบจะไม่ผ่าน "rpm --verify" และแพ็คเกจของคุณจะเสียหาย

คุณต้องการใช้เครื่องมือการบริหารระบบที่ผู้ขายระบบปฏิบัติการของคุณได้ทำการทดสอบหรือไม่หรือไม่ว่าจะใช้ส่วนประกอบที่ยังไม่ผ่านการทดสอบที่คุณดาวน์โหลดจากอินเทอร์เน็ต

เมื่อใดก็ตามถ้าไม่ได้อัปโหลดแพ็คเกจที่เป็นอันตรายไปยัง PyPI ... ผู้ที่ใช้ "sudo pip install" จะสิ้นสุดการใช้งาน payload ที่เป็นอันตรายนั้นด้วยสิทธิ์ระบบเต็มรูปแบบ คุณต้องการสิ่งนั้นไหม? (#principleofleastprivilege)

หากเป็นเพียงแล็ปท็อปของคุณและคุณเสี่ยงต่อภาพแมวน้อยดังนั้นความเสี่ยงอาจต่ำ ... แต่ถ้าเป็นระบบที่มีผู้ใช้หลายคนความเสี่ยงจะถูกคูณด้วย N ถ้าคุณมีข้อมูลใน ระบบที่มีค่าหรือความพร้อมของระบบหรือความน่าเชื่อถือมีค่าดังนั้นความเสี่ยงก็เพิ่มขึ้นเช่นกัน

โปรดเลือกการผจญภัยของคุณเอง แต่โปรดรับความยินยอมจากผู้ใช้รายอื่นที่อาจได้รับผลกระทบจากการเลือกของคุณ พวกเขาอาจไม่พอใจกับความเสี่ยงในระดับเดียวกับคุณ


0

เพื่อเพิ่มคำตอบเหล่านี้: ฉันไม่รู้เกี่ยวกับ Ubuntu แต่บน Fedora ฉันสามารถใช้sudo dnf install python3-numpyรูปแบบเพื่อติดตั้งแพ็คเกจMANY ที่มีประโยชน์สำหรับฉัน สิ่งนี้ไม่มีข้อเสียของการไม่ปลอดภัย (ผู้ดูแลระบบ distro repo มีแพคเกจที่ผ่านการตรวจสอบแล้ว) แต่ยังช่วยให้คุณสามารถติดตั้งได้ทั้งระบบ ข้อเสียเปรียบเพียงอย่างเดียวคือรุ่น repo distro อาจจะล้าหลังแพ็คเกจใน PyPI เล็กน้อย


-1

ไม่ถูกต้อง ฉันไม่สามารถตรวจสอบการอ้างสิทธิ์นี้ ฉันมักจะใช้กับsudo -H เพียง แต่สามารถสร้างความเสียหายแฟ้มระบบปฏิบัติการมากที่สุดเท่าที่ ห้ามใช้กับเมื่อคุณต้องการติดตั้งสำหรับผู้ใช้นั้นเท่านั้นpippipaptsudopip


1
บนคอมพิวเตอร์ส่วนบุคคลของคุณคุณต้องติดตั้งpipระบบเมื่อใด หากคุณเป็นดูแลระบบอาจเป็นเรื่องที่แตกต่าง
Benjamin R
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.