`Sudo pip install` hala kırık bir uygulama mı?


38

Ubuntu'da yeniyim, bu yüzden lütfen benimle kal. Ben yüklü pipbu komutu kullanarak: sudo apt-get -y install python-pip. Sonra NLTK'yı web sitelerindeki komutu kullanarak yükledim sudo pip install -U nltk. Ama sonra yaptığım her şeyin "kırılmış bir uygulama" olduğunu söyleyen bu soruya rastladım . Beni en çok etkileyen çizgi, sudo pipkullanımın yanlış olduğu ve pipçok fazla güç vermenin işletim sistemi dosyalarına zarar verebileceği idi. Birisi bu talebi doğrulayabilir mi?

Not - Sadece sudokomutu denediğimde apt-get -y install python-pipbana 2 hata verdi çünkü kullandım :

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
Talimatlar sudo pip install, doğası gereği yanlıştır. - stackoverflow.com/tr/33004920/95735
Piotr Dobrogost,

"... doğal olarak ...." pshaw
michael

Üzgünüz, kurulumlar sudo pip installkadar kötü curl "some-url" | sudo bash. Benzer şekilde, bazı geliştiricilerin sudo pip installiş istasyonlarına biraz bağımlılık kurmak için kullandığı, sonra kodun bozuk kodunu kontrol ettiği için requirements.txtya da setup.pydosyanın yüklü ne varsa eksik olduğu ve herkesin hangi bağımlılığın gerekli olduğunu bulması gerektiği için birkaç kez yaşadık Adam tatildeyken.
Mike DeSimone

Yanıtlar:


52

Hem sudo pip installve diğer ortak varyantı sudo -H pip installgerektiğini değil kullanımı kullanım kök ayrıcalıkları için bir güvenlik riski olduğu için teşvik edilmelidir pipPyPI (Python Paket Dizini) dan Python paketlerini yüklemek için.

Gönderen https://stackoverflow.com/a/21056000/486919 (vurgu mayın):

Eğer çalıştırdığınızda pipile sudo, çalıştırmak setup.pyile sudo. Başka bir deyişle, Internet'ten rastgele Python kodunu root olarak çalıştırıyorsunuz. Birisi PyPI'ye kötü amaçlı bir proje koyarsa ve onu kurarsanız , makinenize bir saldırgana kök erişimi sağlarsınız. Son zamanlarda yapılan bazı düzeltmelerden pipve PyPI'den önce, saldırgan, güvenilir bir proje indirdiğinizde kodlarını enjekte etmek için orta saldırıda bir adamı çalıştırabilir.

Da belirttiğimiz gibi https://security.stackexchange.com/a/79327/8761 , o nota önemlidir herkes PyPI zararlı olanlar da dahil olmak üzere, Python paketlerini yükleyebilirsiniz.

Kısacası, uygun en az ayrıcalık ilkesi , kullanmayan sudoile pipkesinlikle gerek olmadıkça PyPI gelen Python paketlerini yüklemek için. Bunun yerine, kullanmayı düşünün pip install --user( şu anda Ubuntu'da varsayılan olarak pip installhiçbir sudoek bayrak / seçenek olmadığını pip install --user) veya sanal ortamları (örneğin virtualenv) unutmayın. Tavsiye eden insanları görürseniz , sudo pipveya sudo -H pipyapmadıklarını söyleyin.


2
Geçmişte kullandıysam ne yaptığını nasıl temizlerim?
Endolith

1
Yani bu talimatlar yanlış? tensorflow.org/install/install_linux
Endolit

5
@endolith geri almak için pip kaldırma sudo olabilir. Ayrıca, eğer paket tensorflow, numpy, vb. Gibi güvenilir bir koruyucuysa, "aye! Security!" tartışma gerçekten mantıklı değil. (Ayrıca, "--user" olarak bile kötü niyetli bir paket yüklerseniz, temelde yine de çirkinsiniz. Gerçek kural şu ​​olmalıdır: Bir kapsayıcı hariç, bilinmeyen / güvenilmeyen insanlardan kod yüklemeyin - ama o zaman bile tavsiye edilmez.)
michael 11

2
@ endolith Bu talimatlar sudo kullanmıyor. Belki alıştılar ve yollarının hatasını gördüler? :)
David Gardner

1
sudo pip install"eski" sisteme kurulu Python paketlerini kaldırabilir ve bu işletim sistemi paketlerinin yükseltilmesini veya kaldırılmasını zorlaştırabilir. sudo pip uninstallburada yardımcı olmaz, çünkü yeni paketi kaldırır ancak dosyaları eskisinden geri yüklemez. (Meslektaşım R. Zagar başka bir cevapta daha ayrıntılı olarak ele
alındı

19

Sen kullanmalıdır sudopip yüklemek için apt ile ( sudo apt install python-pip), ancak belirtilen edwinksl cevabı sen kullanmamalısınız sudopaketleri yükleme pip ile , kullanmak gerekir pip install --user <package>sizin kullanıcı için sadece yükleyebilir veya bir kullanma VIRTUALENV daha da paketin kapsamını kısıtlamak için .

Apt, Ubuntu'nun depolarından paketleri kurarken pip, PyPi'den kötü amaçlı olabilecek kullanıcı tarafından yüklenen paketleri kurar.


7

Ve daha temperli bir cevap için:

  1. Gerçekten her zaman yapmak zorundasın sudo apt-get install ..., bu sadece aracın çalışması için tasarlanmıştı.
  2. Tam olarak ne yapmak istediğinize (ve dolayısıyla "tartışma") bağlı olarak sudo [-H]birlikte kullanmak pip installhem mümkün hem de isteğe bağlıdır.

Biri Python'un Mottolar olan "Orada bölgesi varış olmak ve bunu yapmak için tercihen tek --obvious yolu olmalı." Ve çoğu slogan gibi, olası her fırsatta görünüşte sardonik glee ile kırıldı. (En niçin mottos var bu herhalde.) Ne yazık ki, benim en düşünceme göre, Python ekosistem birçok oluşur çakışan zaman "yada yada yada" (şeytan hariç "hızlı sert ve" kurallar, ... kırılmak asla Ayrıntılar, vb.) Neredeyse tüm durumlarda, bu, dil ve araçların tarihsel gelişiminden kaynaklanmaktadır (ve sadece işleriyle ilgilenmek istediklerinde bir tarih dersi almak isteyen / buna ihtiyaç duyan) - ancak Mac / Win / * Nix platformları (örneğin, Unix / Linux benzer bir zihniyete sahiptir,Tüm bu "kırık pratik" ve "doğal olarak yanlış" kargo kültecilerini büyük bir tutam tuzla al. Bazıları aslında iyi demek. (Diğerleri sadece, iyi, kaba.)

Her şeyden önce, temel "kullanıcı başına yüklemeler" yerine, neredeyse her zaman bir sanalenv tercih edersiniz, çünkü gerçekten, muhtemelen ihtiyaç duyacağınız şey budur. Yani şimdi onunla başlayabilirsin. Bunun nasıl yapıldığı, tam olarak "bağlıdır" (yukarıdaki Python sloganına bakın). Conda kullanıyorsanız (çoğunlukla Mac & Windows için), Conda kullanılarak ayarlanır . Eğer "pure" Python [sic] kullanıyorsanız , hangi sürümün ve hangi python'un kullandığınıza bağlı , ancak virtualenvwrapper oldukça kullanışlıdır.

İkincisi, "asla sudo" kuralına karşı bir örnek olarak sudo -H pip install -U numpy, tamamen iyi, hatta avantajlı olanı tercih etmeyi tercih edebilirsiniz. Her sanal araca ayrı ayrı bir sürüm gerekir. Scikit-learn, NumPy, matplotlib, SciPy, pandalar vb. Gibi büyük, popüler çerçeveler bir kez kurulabilir ve ortamlarda yeniden kullanılabilir . Ayrıca, yerel dostu sistem yöneticiniz bunları bir sistemdeki her kullanıcı sudoiçin kurmaya başlayabilir - ve bunu açıkça , örneğin, TensorFlow gibi daha karmaşık kurulumlar için yapıyorlardı.

Ve son olarak, eğer böyle bir şey yapan (Twitter API, metin munging, kod biçimlendirme, vb.) Rastgele bir 3. parti kitaplık kuruyorsanız, o zaman tamamen katılıyorum - sudo ile root olarak yüklemeyin. Elbette, geçerli kullanıcı olarak yükleyin. Ama unutmayın, sizin kullanıcı hesabının tüm gerçekten önemli şeyler vardır .


2
"Temperli" = "hiç kimsenin hislerine zarar vermemek adına kafa karışıklığına neden olan sahte üretken el sıkma yasağı". Sadece karışıklığı önlemek için açık ve net olun: Bunu örnekleriniz de dahil olmak üzere bir temel olarak yapmaya gerek yoktur. Unix gerçekten "kendi yapılandırmanı ve risklerini taşı" dır, kelimenin tam anlamıyla bir C zihniyettir, ancak orada mallocolduğu gibi ihtiyaç duymadığınız yerlerde kullanmayın . --userBayrak neyi OP soruyordu yapar ve hiçbir özel izin gerekmiyor. Bu süreçte sanalenv ile ilgili iyi noktalarınızı baltalıyorsunuz ... bunların hiçbirinde "kargo kültürü" yok.
Benjamin R,

Bu perspektifi ortak cevaplar ve görüşler anketime (eğer yakından okursa) dahil ettim.
michael

1

"Sudo pip install" kullanmak OS satıcınız tarafından sağlanan python içeriğinin üzerine yazabilir ve üzerine yazacaktır. Bu durumda, bundan etkilenen hiçbir satıcı paketi bir "rpm --verify" geçmez ve paketleriniz bozulmuş gibi görünür.

İşletim sistemi satıcınızın test ettiği sistem yönetimi araçlarını mı kullanmak istiyorsunuz, yoksa internetten indirdiğiniz test edilmemiş bileşenleri kullanmak uygun mu?

Olmazsa, kötü amaçlı bir paket PyPI'ye yüklendiğinde ... "sudo pip install" kullananlar bu sistem yükünü tam sistem ayrıcalıklarıyla çalıştıracaktır. Bunu istiyor musun? (#Principleofleastprivilege)

Bu sadece dizüstü bilgisayarınızsa ve yalnızca birkaç kedi resmi riski varsa, o zaman risk muhtemelen düşüktür ... ancak çok kullanıcılı bir sistemse, risk şimdi N ile çarpılır. değeri olan sistem veya sistemin kullanılabilirliği veya güvenilirliği değere sahipse, riskler de artar.

Lütfen kendi maceranızı seçmekte özgürsünüz, ancak lütfen seçiminizden etkilenebilecek diğer kullanıcıların onayını alın. Sizinle aynı risk seviyesinde rahat olmayabilirler.


0

Bu cevapları eklemek için: Ubuntu'yu tanımıyorum, ancak Fedora'da bana yararlı olan MANY paketlerini sudo dnf install python3-numpyyüklemek için format kullanabiliyorum . Bu güvensiz olma dezavantajına sahip değildir (distro repo bakımcısı onaylanmış paketleri vardır), ayrıca sistem genelinde kurmanıza da izin verir. Tek dezavantajı distro repo sürümlerinin PyPI'deki paketleri biraz geciktirmiş olması olabilir.


-1

Hayır, bu doğru. Bu talebi doğrulayamıyorum. Hep kullanmak sudo -Hile pip. pipişletim sistemi dosyalarına yalnızca zarar verebilir apt. Sadece kullanmayın sudoile pipo kullanıcı için sadece yüklemek istediğinizde.


1
Kişisel bilgisayarınızda, pipsistem genelinde ne zaman yüklemeniz gerekir ? Bir sysadmin iseniz, belki farklı bir hikaye.
Benjamin R,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.