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 installcurl "some-url" | sudo bash安装一样糟糕。同样,我们曾经有几次使用某些开发人员sudo pip install在其工作站上安装某些依赖项,然后将损坏的代码检入到存储库中,因为requirements.txtor setup.py文件丢失了所安装的内容,其他所有人都弄清楚了需要什么依赖项那家伙正在休假时。
Mike DeSimone

Answers:


52

无论sudo pip install和它的其他常见变异sudo -H pip install应该被鼓励,因为它是一个安全风险使用root权限来使用pip,以一封来自PyPI(Python包索引)安装Python包。

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

当您pip使用时sudo,您会setup.py使用sudo。换句话说,您可以从互联网上以根用户身份运行任意Python代码。 如果有人在PyPI上放置了一个恶意项目,然后安装了该项目,则可 以为攻击者提供对计算机的根访问权限。在对pipPyPI和PyPI 进行一些最新修复之前,攻击者还可能在您下载值得信赖的项目时,在中间攻击中让一名男子注入他们的代码。

https://security.stackexchange.com/a/79327/8761所述,必须注意,任何人都可以将Python软件包(包括恶意软件包)上载到PyPI。

简而言之,根据最小特权原则,除非绝对需要,否则不要使用sudowith pip从PyPI安装Python软件包。而是考虑使用pip install --user(请注意,目前在Ubuntu上,默认情况下pip install,不带no sudo标志或选项的默认情况下pip install --user)或虚拟环境(如virtualenv)。如果您看到有人推荐sudo pipsudo -H pip,请告诉他们不要这样做。


2
如果我过去曾使用过它,该如何清理它的工作?
endlith

1
那么这些指示是错误的吗?tensorflow.org/install/install_linux
endolith

5
@endolith,您可以对pip卸载进行sudo撤消。而且,但是,如果软件包来自受信任的维护者,例如tensorflow,numpy等,则“ aye!security!”!争论没有任何意义。(此外,即使您以“ --user”身份安装任何恶意程序包,也基本上还是被搞砸了。真正的规则应该是:不要安装来自未知/不受信任的人的代码...除了在容器中,否则,即使如此,也不推荐。)
迈克尔(Michael

2
@endolith这些指令没有说要使用sudo。也许他们习惯了,并且已经看到了自己的方式的错误?:)
David Gardner

1
sudo pip install可以卸载“旧的”系统安装的Python软件包,这可能会使升级或卸载这些OS软件包变得困难。sudo pip uninstall在这里无济于事,因为它会删除新软件包,但不会从旧软件包还原文件。(我的同事R. Zagar在另一个答案中进行了更详细的介绍。)
Mike DeSimone

19

您必须使用sudo安装PIP 使用aptsudo apt install python-pip),但在规定edwinksl的答案你不应该使用sudo安装软件包与点子,你应该使用pip install --user <package>只安装您的用户,或使用的virtualenv,以进一步限制包的范围。

Apt从Ubuntu的存储库安装软件包,而pip从PyPi安装用户上传的软件包,这可能是恶意的。


7

对于更温和的答复:

  1. 实际上,您的确确实需要这样做sudo apt-get install ...,这就是该工具的设计工作方式。
  2. 使用sudo [-H]with pip install是可能的也是可选的,具体取决于您要执行的操作(因此也存在“争议”)。

其中一个Python的座右铭“应该有one--和最好只有一个--obvious办法做到这一点。” 和大多数座右铭一样,似乎在所有可能的机会中,它都充满了讽刺的欢乐。(我猜这就是座右铭的原因。)不幸的是,以我最卑微的观点,Python生态系统由许多相互冲突的 “硬性和快速性”规则组成,永不被打破……除了“ yada yada yada”(魔鬼,详细信息等)。在几乎所有情况下,这都归因于语言和工具的历史演进(以及谁想要/需要一份历史课程,而他们只是想继续工作),也可能归因于Mac / Win / * Nix平台(例如Unix / Linux具有类似的思路,确实要用大量的盐来进行所有这些“断头行事”“天生错误”的货运主义者。有些实际上确实很好。(其他人只是,很平均)。

首先,您几乎总是会选择virtualenv,而不是基本的“按用户安装”,因为实际上,这最终可能是您需要的。因此,您最好现在就开始。确切地说,如何做到这一点“取决于”(请参见上面的Python座右铭)。如果您使用的是Conda(主要用于Mac和Windows),则将使用Conda进行设置。如果使用“ pure” Python [sic],则取决于您使用的版本和python utils,但是virtualenvwrapper非常方便。

其次,作为“从不sudo”规则的反例,您可能更喜欢sudo -H pip install -U numpy,这是完美的,甚至是有利的,因为它可以避免下载/重新安装/维护大型库,而您只需要/需要一个版本,分别放入每个virtualenv中。大型,流行的框架(如scikit-learn,NumPy,matplotlib,SciPy,pandas等)可以一次安装完成,并可以在各种环境中重复使用。此外,您本地友好的sys-admin也许可以为系统上的每个用户安装这些文件-显然,他们也可以通过进行此操作sudo,例如,对于更复杂的安装(例如TensorFlow)。

最后,如果您要安装某种随机的第三方库(Twitter API,文本修改,代码格式等),那么我完全同意-不要通过sudo作为root安装。当然,以您的当前用户身份安装它。但是请记住,您的用户帐户具有您所有真正重要的东西


2
凡“脾气暴躁” =“适得其反的人为操纵目的而引起的混乱,是为了不伤害任何人的感情”。只是清楚明确地避免混淆:根本不需要将它作为基准,包括您的示例。Unix确实是“承担自己的配置并承担风险”,它的字面意义是C语言,但是像在那儿一样,不要malloc在不需要的地方使用。该--user标志执行OP所要求的操作,不需要特殊权限。您在此过程中破坏了关于virtualenv的优缺点 ……与此无关。
本杰明·R

在对常见的回应和观点进行调查时,我确实已经包括了这种观点(如果仔细阅读的话)。
迈克尔

1

使用“ sudo pip install”可以并且将覆盖您的OS供应商提供的python内容。发生这种情况时,受此影响的任何供应商软件包都不会通过“ rpm --verify”,并且您的软件包似乎已损坏。

您是否要使用操作系统供应商已测试过的系统管理工具,还是可以使用从Internet下载的未经测试的组件?

当(如果不是这样)恶意软件包上传到PyPI时……使用“ sudo pip install”的用户将最终以完全的系统特权运行该恶意负载。你想要那个吗?(#principleofleastprivilege)

如果只是您的笔记本电脑,并且只冒几张猫的照片,那么风险可能很小……但是,如果是多用户系统,则现在的风险乘以N。如果系统具有价值,或者系统可用性或可靠性具有价值,那么风险也会上升。

请随时选择自己的冒险之旅,但请征得其他用户的知情同意,这可能会受到您的选择的影响。他们可能不适应与您相同的风险水平。


0

要添加到这些答案中:我不知道Ubuntu,但是在Fedora上,我可以使用sudo dnf install python3-numpyformat安装对我有用的许多软件包。这不具有不安全的缺点(发行版存储库维护程序已验证软件包),但是还允许您在系统范围内安装。唯一的缺点是发行版的回购版本可能会稍微落后于PyPI中的软件包。


-1

不,这是正确的。我无法验证此声明。我总是用sudo -Hpippip最多只能损坏操作系统文件apt。只有不使用sudopip当您希望只安装该用户。


1
在您的个人计算机上,什么时候需要在pip系统范围内安装?如果您是系统管理员,则可能是另一回事。
本杰明·R
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.