`sudo pip install` 这个做法还是有问题的吗?

我对Ubuntu还不熟悉,请多包涵。我使用以下命令安装了pipsudo 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?

4告诉你使用 sudo pip install 的指令是错误的。 - Piotr Dobrogost
3抱歉,sudo pip installcurl "some-url" | sudo bash 安装方式一样糟糕。同样地,我们曾经遇到过几次,一些开发人员在他们的工作站上使用 sudo pip install 安装某些依赖项,然后因为缺少 requirements.txtsetup.py 文件中所安装的内容,将有问题的代码提交到代码库中,而其他人则需要弄清楚需要哪些依赖项,而这个人正在度假。 - Mike DeSimone
6个回答

不应鼓励使用sudo pip install及其其他常见变体sudo -H pip install,因为使用root权限来使用pip从PyPI(Python Package Index)安装Python包存在安全风险。

根据https://stackoverflow.com/a/21056000/486919(重点是我的):

当您使用sudo运行pip时,您以root身份运行setup.py。换句话说,您以root身份运行来自互联网的任意Python代码。如果有人在PyPI上发布了恶意项目并且您安装了它,攻击者将获得对您机器的root访问权限。在最近修复pip和PyPI之前,攻击者还可以在您下载可信任项目时进行中间人攻击,注入他们的代码。

根据https://security.stackexchange.com/a/79327/8761所提到的,需要注意任何人都可以向PyPI上传Python包,包括恶意软件。
简而言之,根据最小权限原则,除非绝对必要,不要使用sudo pip安装来自PyPI的Python包。相反,考虑使用pip install --user(请注意,在当前Ubuntu上,pip install默认为pip install --user)或虚拟环境(如virtualenv)。如果你看到有人推荐使用sudo pipsudo -H pip,请告诉他们不要这样做。

5如果我过去使用了它,我该如何清理它所做的事情? - endolith
2这些指示是错误的吗?https://www.tensorflow.org/install/install_linux - endolith
7@endolith,你可以使用sudo pip uninstall来撤销操作。不过,如果软件包来自可信的维护者,比如tensorflow、numpy等,那么"aye! security!"这个论点就没有什么意义了。(而且,即使你以"--user"方式安装任何恶意软件包,你基本上也完蛋了。真正的规则应该是:不要从未知/不可信任的人那里安装代码...除非在容器中--但即便如此,也不推荐这样做。) - michael
2@endolith 那些指示没有说要使用sudo。也许以前是这样,但他们现在意识到了错误? :) - David Gardner
1@DavidGardner 我猜?指示是这样的:http://web.archive.org/web/20180828233036/https://www.tensorflow.org/install/install_linux#2_install_tensorflow_on_system - endolith
3sudo pip install可以卸载"旧的"系统安装的Python包,这可能会导致升级或卸载那些操作系统包变得困难。在这里,sudo pip uninstall无法帮助,因为它只会删除新的包,而不会恢复旧包的文件。(我的同事R. Zagar在另一个答案中详细说明了这一点。) - Mike DeSimone
@MikeDeSimone 如果你愿意的话,随时可以对我的回答提出修改建议,并附上你同事的回答链接。 - edwinksl
@edwinksl,我不确定如何在此页面上链接到另一个答案。 - Mike DeSimone

你必须使用sudo来安装pip(通过apt,即sudo apt install python-pip),但正如edwinksl's answer中所述,你不应该使用sudo来安装包(通过pip),你应该使用pip install --user 来仅为你的用户安装,或者使用virtualenv来进一步限制包的范围。
Apt从Ubuntu的软件仓库安装软件包,而pip从PyPi安装用户上传的软件包,这些软件包可能存在恶意代码。

而对于一个更加温和的回答:
  1. 你确实总是需要使用sudo apt-get install ...,这只是工具设计的方式。
  2. 在使用pip install时,使用sudo [-H]是可能和可选的,具体取决于你想要做什么(因此,“有争议”)。

一个Python的座右铭是:“应该有一种--而最好只有一种--明显的方法来做到这一点。”就像大多数座右铭一样,它在每一个可能的机会都被戏谑地打破了。(我想这就是座右铭存在的原因。)不幸的是,在我非常谦虚的意见中,Python生态系统由许多相互冲突的“硬性规则”组成,永远不可违背...除非是“呀哒呀哒”(恶魔、细节等)。在几乎所有情况下,这是由于语言和工具的历史演变所致(而当人们只想继续工作时,谁想要/需要历史课呢?)--但也可能是由于Mac/Win/*Nix平台之间的差异(例如,Unix/Linux有类似的心态,但具有数十年的成熟经验优势)。因此,请对所有这些“错误的做法”“本质上错误的”盲从者抱着巨大的怀疑态度。有些人确实好心。(其他人只是,嗯,刻薄。)

首先,与其使用基本的“每个用户安装”,你几乎总是更喜欢使用virtualenv,因为实际上,这可能是你最终需要的。所以你最好现在就开始使用它。如何做到这一点,确切地说,“取决于”(参见Python格言,上文)。如果你正在使用Conda(主要用于Mac和Windows),它将会设置使用Conda。如果使用“纯”Python [sic],那么它取决于你使用的版本和哪些Python工具,但virtualenvwrapper非常方便。
其次,作为“永远不要使用sudo”规则的一个反例,您可能更喜欢使用sudo -H pip install -U numpy,这是完全可以接受的,甚至有优势,因为它可以避免在每个虚拟环境中单独下载/安装/维护大型库,而您只需要/需要一个版本。像scikit-learn、NumPy、matplotlib、SciPy、pandas等这样的大型流行框架可以安装一次并完成,并且可以在各种环境中重复使用。此外,您友好的本地系统管理员可能能够为系统上的每个用户安装这些库 - 很明显,他们也会通过sudo来执行此操作,例如对于TensorFlow等更复杂的安装。

最后,如果您正在安装某个随机的第三方库来执行这样那样的操作(如Twitter API、文本转换、代码格式化等),那么我完全同意 - 不要使用sudo以root身份安装。当然,请以当前用户的身份进行安装。但是请记住,您的用户帐户包含了所有真正重要的内容


5当“tempered”=“为了试图不伤害任何人的感情而引起混乱的无效焦虑和瞎忙”,请明确清晰地表达以避免混淆:包括您的例子在内,基本上没有必要这样做。Unix确实是“自己配置和风险”的,它就像C语言一样,但是像那里一样,在不需要使用malloc的地方不要使用它。--user标志可以完成OP所要求的工作,而且不需要特殊权限。在此过程中,您正在削弱有关_virtualenv_的好处...这些都不是“模仿派”的东西。 - Benjamin R
我在对常见回应和观点的调查中已经包含了这个角度(如果仔细阅读的话)。 - michael
非常出色,非常明智的评论(虽然有点长,但这是必要的)。我正在以艰难的方式发现,在我过去使用的Debian(现在是Devuan)系统上的一致性不足(已经有10年了),许多pip install都是以root身份执行的(没有sudo,谢谢),还有一些以用户或root身份执行的pip3 install...真是一团糟。 - Pierre

使用"sudo pip install"可能会覆盖操作系统供应商提供的Python内容。当发生这种情况时,受影响的供应商软件包将无法通过"rpm --verify"验证,并且您的软件包将显示为已损坏。
您想要使用经过您的操作系统供应商测试过的系统管理工具,还是使用从互联网上下载的未经测试的组件可以接受?
当恶意软件包被上传到PyPI时... 使用"sudo pip install"的人将以完全系统权限运行该恶意负载。您希望这样吗?(#最小特权原则)
如果只是您的笔记本电脑,并且您只冒着一些猫图片的风险,那么风险可能很低...但如果是多用户系统,则风险现在乘以N。如果系统中有具有价值的数据,或者系统可用性或可靠性具有价值,那么风险也会增加。
请随意选择自己的冒险,但请获得可能受到您选择影响的其他用户的知情同意。他们可能不愿意承担与您相同级别的风险。

为了补充这些回答:我不清楚Ubuntu,但在Fedora上,我可以使用sudo dnf install python3-numpy格式来安装对我很有用的许多软件包。这样做既不会存在不安全的缺点(发行版储存库维护者已验证软件包),还可以进行系统级的安装。唯一的缺点是发行版储存库中的软件包版本可能稍微滞后于PyPI上的软件包。

不,这是正确的。我无法验证这个说法。我总是使用sudo -Hpippip只能像apt一样损坏操作系统文件。只有当您想要仅为该用户安装时,才不要使用sudopip

1在您的个人计算机上,何时需要系统范围内安装pip? 如果您是系统管理员,也许情况就不同了。 - Benjamin R
apt命令和apt软件包是专为您的操作系统设计、保护、签名和部署的协调套件。Pip软件包则是为不同的生态系统设计的,很可能会破坏您的操作系统,甚至可能是恶意的木马程序,因为它们没有经过操作系统供应商的签名认证,所以无法信任。 - nealmcb