pip并不尊重PIP_INDEX_URL与sudo

时间:2014-06-10 08:50:16

标签: python repository pip

根据doc我可以直接使用我的私人pypi存储库而不是官方存储库:

For pip this can be done by setting the environment variable PIP_INDEX_URL in your .bashrc/.profile/.zshrc:
export PIP_INDEX_URL=http://localhost:8080/simple/

所以我将我的私有存储库(例如,http://pypi.mycompany.com/simple)添加到我的Debian服务器上的/etc/profile。然而,pip仍会引发错误:

john@server:~$ sudo pip install ipython
Downloading ...
    Cannot fetch index base URL https://pypi.python.org/simple/
    ...

看起来像pip忽略了我设置的环境变量PIP_INDEX_URL。为什么呢?

更新

按照@ Ivo的指示,我发现我的Python根本没有看到变量:

john@server:~$ sudo python -c "import os; print(os.getenv('PIP_INDEX_URL'))"
None

2 个答案:

答案 0 :(得分:4)

找到它。很简单:出于安全原因,默认情况下sudo不会使用环境变量。要告诉sudo保留env变量,可以使用-E选项,例如

sudo -E pip install ipython

答案 1 :(得分:0)

Sudo 通过重置大多数环境变量来净化安全环境。默认情况下,它会重置其保留列表中的变量之外的所有变量。 Sudo 有三类环境变量:check、reset、preserve。默认情况下,它会重置保留列表中列出的变量之外的所有变量。

可用选项:

  1. 如前所述,您可以使用 -E 也拼写为 --preserve-env 全局传递所有环境变量。

    这代表一个安全问题。传递环境变量可能会污染或以其他方式影响(安全)环境中的执行。考虑 $LD_PRELOAD$IFS 的问题。

  2. -E--preserve-env 支持要保留的变量参数列表,以及默认变量:

    sudo --preserve-env=PIP_INDEX_URL pip install python
    
  3. 您可以通过 shell 将 env 变量显式传递给 ssh 命令:

    sudo -e PIP_INDEX_URL=${PIP_INDEX_URL} pip install ipython
    

    ${PIP_INDEX_URL} 在传递给 sudo 之前被 shell 展开。

    这是一个方便的 shell 技巧,适用于 ssh 和任何其他将参数和环境直接传递给子进程的东西。

  4. 修改 sudoers 中的 sudo 配置以扩展允许传递给子级的环境变量列表。请参阅 env_keep 选项。

    DEFAULT env_keep+=PIP_INDEX_URL
    

    我认为这个选项是最干净的,尤其是在具有多个用户且预期使用相同 pip 选项的系统上。

    您的 sudoers 文件的最后一行可能包含一个 #includedir 指令。如果是这样,请将您的修改放在该目录中的文件中。例如/etc/sudoers.d/pip_environment 并为 PIP_INDEX_URLPIP_TRUSTED_HOSTPIP_EXTRA_INDEX_URL 和配置中所需的任何其他选项添加保留选项。

参考:

  • sudoers 配置:man 5 sudoers

  • sudo 选项:man 8 sudo

  • Secure Programming for Linux and Unix HOWTO

  • pip 环境变量以 PIP_ 格式命名,后跟完整命令行标志的大写拼写。请参阅:pip config file documentation

  • 您可以在以 root 身份运行 sudo -V 的输出中查看检查、重置和保留列表:

    % sudo sudo -V
    
    # ...
    Environment variables to check for sanity:
            TZ
            TERM
    # ...
    Environment variables to remove:
            *=()*
    # ...
    Environment variables to preserve:
            MAIL
            HOME