`sudo pip install` 仍然是一个坏习惯吗?

wha*_*hat 52 package-management permissions python pip

我是 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?
Run Code Online (Sandbox Code Playgroud)

edw*_*ksl 75

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

来自/sf/answers/1473920031/(强调我的):

当您运行pip使用sudo,运行setup.py使用sudo。换句话说,您以 root 身份从 Internet 运行任意 Python 代码。 如果有人在 PyPI 上放置了一个恶意项目并且你安装了它,你 就给了攻击者对你的机器的 root 访问权限。在最近对pipPyPI进行一些修复之前,攻击者还可以在您下载可信赖的项目时运行中间人攻击来注入他们的代码。

https://security.stackexchange.com/a/79327/8761 所述,重要的是要注意任何人都可以将 Python 包(包括恶意包)上传到 PyPI。

总之,按照最小权限原则,除非绝对需要,否则不要使用sudowithpip从 PyPI 安装 Python 包。相反,请考虑使用pip install --user(请注意,目前在 Ubuntu 上pip install没有sudo或附加标志/选项默认为pip install --user)或虚拟环境(例如virtualenv)。如果您看到有人推荐sudo pipsudo -H pip,请告诉他们不要。

  • @endolith 您可以 sudo pip uninstall 以撤消。此外,如果包来自受信任的维护者,例如 tensorflow、numpy 等,“是的!安全!” 争论真的没有意义。(另外,如果你安装了任何恶意包,即使是“--user”,你基本上还是被搞砸了。真正的规则应该是:不要安装来自未知/不受信任的人的代码......除了在容器中——但是即便如此,也不推荐。) (6认同)
  • 如果我过去使用过它,我该如何清理它所做的事情? (5认同)
  • `sudo pip install` 可以卸载系统安装的“旧”Python 包,这会使升级或卸载这些操作系统包变得困难。`sudo pip uninstall` 在这里没有帮助,因为它删除了新包但不会从旧包中恢复文件。(我的同事 R. Zagar 在另一个答案中有更详细的介绍。) (3认同)
  • 那么这些指令是错误的吗?https://www.tensorflow.org/install/install_linux (2认同)
  • @endolith 这些说明并没有说要使用 sudo。也许他们曾经见过并且他们已经看到了他们方式的错误?:) (2认同)

piz*_*184 24

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

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


mic*_*ael 7

对于更温和的答复:

  1. 您确实总是必须这样做sudo apt-get install ...,这正是该工具设计的工作方式。
  2. 使用sudo [-H]withpip install是可能的和可选的,这取决于您究竟想要做什么(因此,“争议”)。

其中一个Python的座右铭“应该有one--和最好只有一个--obvious办法做到这一点。” 和大多数座右铭一样,它似乎在每一个可能的机会都被讽刺的欢乐所打破。(这就是格言存在的原因,我猜。)不幸的是,在我最谦虚的意见中,Python 生态系统由许多相互冲突的“硬性和快速”规则组成,永远不会被打破......除了“yada yada yada”(魔鬼,详情等)。在几乎所有情况下,这是由于语言和工具的历史演变(以及当他们只想继续工作时想要/需要历史课)——但也可能是由于 Mac/Win/ * Nix 平台(例如,Unix/Linux 有类似的心态,一定要把所有这些“错误的做法”“本质上是错误的”货物崇拜者带上一大撮盐。有些确实是善意的。(其他人只是,好吧,卑鄙。)

首先,与基本的“每用户安装”相比,您几乎总是更喜欢 virtualenv,因为实际上,这可能是您最终需要的。所以你不妨现在就开始。这是如何完成的,确切地说,“取决于”(参见上面的 Python 座右铭)。如果您使用的是 Conda(主要用于 Mac 和 Windows),它将使用 Conda进行设置。如果使用“纯” Python [sic],则取决于您拥有的版本和 Python实用程序,但virtualenvwrapper非常方便。

其次,作为“从不sudo”规则的反例,您可能更喜欢sudo -H pip install -U numpy,这非常好,甚至是有利的,因为它可以避免下载/重新安装/维护大型库,而您只想要/需要一个版本,分别进入每个 virtualenv。像 scikit-learn、NumPy、matplotlib、SciPy、pandas 等大型流行框架,可以一次性安装完成,并可以跨环境重复使用。此外,您当地友好的系统管理员可能能够为系统上的每个用户安装这些- 显然他们也会通过sudo,例如,对于更复杂的安装,例如 TensorFlow。

而且,最后,如果您正在安装一些随机的 3rd 方库来执行某某某事(Twitter API、文本编辑、代码格式化等),那么我完全同意——不要通过 sudo 将它安装为 root。当然,以您当前的用户身份安装它。但请记住,您的用户帐户拥有您所有真正重要的东西

  • 其中“脾气暴躁”=“为了不伤害任何人的感情而引起混乱的适得其反的绞尽脑汁”。只需清晰明确以避免混淆:从来没有必要将此作为基线,包括您的示例。Unix 确实是“滚动你自己的配置和风险”,它实际上是一种 C 思维方式,但就像那里一样,不要在不需要的地方使用 `malloc`。`--user` 标志执行 OP 要求的操作,不需要特殊权限。在这个过程中,你正在破坏你关于 _virtualenv_ 的优点......没有关于任何“货物崇拜者”的任何内容。 (4认同)