O `sudo pip install` ainda é uma prática interrompida?

38

Eu sou novo no Ubuntu, então por favor, tenha paciência comigo. Eu instalei pipusando este comando: sudo apt-get -y install python-pip. Então eu instalei NLTK usando o comando em seu site, o que era: sudo pip install -U nltk. Mas então eu tropecei nessa questão que diz que tudo o que fiz foi uma "prática interrompida". A linha que mais me impressionou foi que o uso sudo pipé inerentemente errado e que dar pipmuita força pode danificar os arquivos do sistema operacional. Alguém pode validar esta reivindicação?

Nota - usei apenas sudoporque, quando tentei o comando, apt-get -y install python-pipele me deu 2 erros:

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?
o quê o quê o quê
fonte
3
Instruções dizendo sudo pip installsão inerentemente erradas. - de stackoverflow.com/a/33004920/95735
Piotr Dobrogost
"... inerentemente ...." pshaw
michael
Desculpe, sudo pip installé tão ruim quanto curl "some-url" | sudo bashinstala. Da mesma forma, tivemos algumas vezes em que algum desenvolvedor costumava sudo pip installinstalar alguma dependência em sua estação de trabalho e depois fazia o check-in de código quebrado no repositório porque o arquivo requirements.txtou setup.pyestava faltando o que quer que eles instalassem, e todos os outros descobriram que dependência era necessária enquanto o cara estava de férias.
Mike DeSimone 22/06

Respostas:

52

Ambos sudo pip installe sua outra variante comum nãosudo -H pip install devem ser incentivados, pois é um risco de segurança usar privilégios de root para instalar pacotes Python a partir do PyPI (Índice de Pacotes Python).pip

De https://stackoverflow.com/a/21056000/486919 (ênfase minha):

Quando você corre pipcom sudo, você corre setup.pycom sudo. Em outras palavras, você executa código Python arbitrário da Internet como raiz. Se alguém colocar um projeto mal-intencionado no PyPI e você o instalar, você concederá a um invasor o acesso root à sua máquina. Antes de algumas correções recentes no pipPyPI, um invasor também pode executar um homem no meio do ataque para injetar seu código quando você baixa um projeto confiável.

Conforme mencionado em https://security.stackexchange.com/a/79327/8761 , é importante observar que qualquer pessoa pode fazer upload de pacotes Python, incluindo maliciosos, para o PyPI.

Em resumo, de acordo com o princípio do menor privilégio , não use sudocom pippara instalar pacotes Python a partir do PyPI, a menos que seja absolutamente necessário. Em vez disso, considere usar pip install --user(observe que, pip installsem nenhum sudosinalizador / opções adicionais padrão pip install --userno Ubuntu atualmente) ou ambientes virtuais (como virtualenv). Se você vir pessoas recomendando sudo pipou sudo -H pip, por favor, diga-lhes para não.

edwinksl
fonte
2
Se eu o usei no passado, como faço para limpar o que ele fez?
Endolith
11
Então, essas instruções estão erradas? tensorflow.org/install/install_linux
endolith
5
@ endolith, você pode sudo a desinstalação do pip para desfazer. Além disso, se o pacote for de um mantenedor confiável, como tensorflow, numpy, etc., a "aye! Security!" argumento realmente não faz sentido. (Além disso, se você instalar qualquer pacote malicioso, mesmo que "--user", esteja basicamente ferrado de qualquer maneira. A regra real deve ser: não instale código de pessoas desconhecidas / não confiáveis ​​... exceto em um contêiner - mas mesmo assim, não recomendado).
michael
2
@ endolith Essas instruções não dizem para usar o sudo. Talvez eles costumavam e viram o erro de seus caminhos? :)
David Gardner
11
sudo pip installpode desinstalar pacotes Python "antigos" instalados pelo sistema, o que pode dificultar a atualização ou desinstalação desses pacotes do sistema operacional. sudo pip uninstallnão ajuda aqui, porque remove o novo pacote, mas não restaura os arquivos do antigo. (Meu colega R. Zagar entra em mais detalhes em outra resposta.)
Mike DeSimone
19

Você deve usar sudopara instalar o pip com o apt ( sudo apt install python-pip), mas como indicado na resposta do edwinksl, você não deve sudoinstalar os pacotes com o pip , deve pip install --user <package>instalar apenas para o usuário ou usar um virtualenv para restringir ainda mais o escopo do pacote .

O Apt instala pacotes dos repositórios do Ubuntu, enquanto o pip instala pacotes enviados pelo usuário do PyPi, que podem ser maliciosos.

pizzapants184
fonte
7

E para uma resposta mais temperada:

  1. Você realmente precisa sempre sudo apt-get install ..., é assim que a ferramenta foi projetada para funcionar.
  2. Usar sudo [-H]com pip installé possível e opcional, dependendo exatamente do que você deseja fazer (e, portanto, "controvérsia").

Um dos lemas de Python é "Deve haver um - e de preferência apenas um - modo óbvio de fazê-lo". E, como a maioria dos lemas, é quebrado com alegria sardônica, aparentemente em todas as oportunidades possíveis. (É por isso que os lemas existem, eu acho.) Infelizmente, na minha opinião mais humilde, o ecossistema Python consiste em muitas regras "duras e rápidas" conflitantes , que nunca serão quebradas ... exceto quando "yada yada yada" (diabo, detalhes, etc). Em quase todos os casos, isso se deve à evolução histórica do idioma e das ferramentas (e quem quer / precisa de uma lição de história quando quer apenas continuar seu trabalho) - mas também pode ser devido a diferenças no Mac / Win / * Plataformas Nix (por exemplo, Unix / Linux tem uma mentalidade semelhante,tome todas essas "práticas desestruturadas" e cultistas de carga "inerentemente errados" com uma enorme pitada de sal. Alguns realmente significam bem. (Outros são apenas, bem, maus.)

Antes de tudo, em vez de "instalações por usuário" básicas, você quase sempre prefere um virtualenv, porque na verdade é provavelmente o que você vai precisar. Então você pode começar com isso agora. Como isso é feito, exatamente "depende" (veja o lema do Python, acima). Se você estiver usando o Conda (principalmente para Mac e Windows), ele será configurado usando o Conda . Se estiver usando Python "puro" [sic] , isso depende de qual versão e quais utilitários python você possui, mas o virtualenvwrapper é bastante útil.

Segundo, apenas como um contra-exemplo da regra "nunca sudo", você pode preferir sudo -H pip install -U numpy, o que é perfeitamente bom e até vantajoso, pois permite evitar o download / reinstalação / manutenção de grandes bibliotecas, nas quais você só deseja / precisa de uma versão para cada virtualenv separadamente. Estruturas grandes e populares como scikit-learn, NumPy, matplotlib, SciPy, pandas etc. podem ser instaladas uma vez e concluídas e reutilizadas em ambientes . Além disso, seu administrador de sistema amigável local pode conseguir instalá-los para todos os usuários de um sistema - e obviamente eles o sudofarão via também, por exemplo, para instalações mais complicadas, como o TensorFlow.

E, finalmente, se você estiver instalando alguma biblioteca aleatória de terceiros que faz isso e aquilo (API do Twitter, alteração de texto, formatação de código etc.), concordo totalmente - não a instale como root via sudo. Claro, instale-o como seu usuário atual. Mas lembre-se, sua conta de usuário tem todas as suas coisas realmente importantes .

Michael
fonte
2
Onde "temperado" = "falsificação contraproducente de torcer as mãos, convidando a confusão para tentar não ferir os sentimentos de ninguém". Apenas seja claro e explícito para evitar confusão: nunca há necessidade de fazer isso como linha de base, incluindo seus exemplos. O Unix é de fato "role sua própria configuração e riscos", é literalmente uma mentalidade C, mas, como lá, não use malloconde você não precisa. O --usersinalizador faz o que o OP estava pedindo e não requer permissões especiais. Você está minando seus pontos positivos sobre o virtualenv no processo ... nada de "cultista de carga" sobre nada disso.
Benjamin R
Eu já incluí essa perspectiva na minha pesquisa de respostas e opiniões comuns (se alguém ler atentamente).
24518 Michael
1

O uso de "sudo pip install" pode e substituirá o conteúdo python fornecido pelo fornecedor do seu sistema operacional. Quando isso acontece, qualquer pacote de fornecedor afetado por isso não passa um "rpm --verify" e seus pacotes parecem estar corrompidos.

Deseja usar as ferramentas de administração do sistema testadas pelo fornecedor do sistema operacional ou está tudo bem em usar componentes não testados que você baixou da Internet?

Quando, não se, um pacote mal-intencionado for carregado no PyPI ... as pessoas que usarem "sudo pip install" acabarão executando essa carga maliciosa com privilégios completos do sistema. Você quer isso? (#principleofleastprivilege)

Se for apenas seu laptop e você estiver apenas arriscando algumas fotos de gatos, o risco provavelmente será baixo ... mas se for um sistema multiusuário, o risco será agora multiplicado por N. Se você tiver dados no sistema que tem valor, ou disponibilidade ou confiabilidade do sistema têm valor, os riscos também aumentam.

Sinta-se à vontade para escolher sua própria aventura, mas obtenha o consentimento informado dos outros usuários que podem ser afetados por sua escolha. Eles podem não se sentir confortáveis ​​com o mesmo nível de risco que você.

Randy Zagar
fonte
0

Para adicionar a essas respostas: Eu não sei sobre o Ubuntu, mas no Fedora eu posso usar o sudo dnf install python3-numpyformato para instalar MUITOS pacotes úteis para mim. Isso não tem a desvantagem de ser inseguro (o mantenedor de repositório de distros validou pacotes), mas também permite a instalação em todo o sistema. A única desvantagem é que as versões de repositório de distribuição podem estar um pouco atrasadas nos pacotes no PyPI.

Milind R
fonte
-1

Não, isso está correto. Não consigo validar esta reivindicação. Eu sempre uso sudo -Hcom pip. pipsó pode danificar arquivos do sistema operacional, tanto quanto apt. Só não use sudocom pipquando você deseja instalar apenas para esse usuário.

fosslinux
fonte
11
No seu computador pessoal, quando você precisa instalar o pipsistema inteiro? Se você é um administrador de sistemas, talvez seja uma história diferente.
Benjamin R