pip.conf 中用于私有 PyPI 的凭据

Posted

技术标签:

【中文标题】pip.conf 中用于私有 PyPI 的凭据【英文标题】:Credentials in pip.conf for private PyPI 【发布时间】:2018-11-01 07:07:38 【问题描述】:

我有一个私有 PyPI 存储库。有什么方法可以将凭据存储在类似于.pypircpip.conf 中?

我的意思。目前在.pypirc可以有这样的配置:

[distutils]
index-servers = custom

[custom]
repository: https://pypi.example.com
username: johndoe
password: changeme

根据我发现你可以输入pip.conf

[global]
index = https://username:password@pypi.example.com/pypi
index-url = https://username:password@pypi.example.com/simple
cert = /etc/ssl/certs/ca-certificates.crt

但在这里我看到两个问题:

    对于每个网址,您每次都需要指定相同的用户名和密码。 用户名和密码在日志中可见,因为它们是 URL 的一部分。

有没有办法在url之外存储用户名和密码?

【问题讨论】:

我想知道 pip 是否可以使用 ssh 连接并使用 ssh 密钥进行身份验证。 SSL 证书也可用于对用户进行身份验证,但当然为此您需要更改 http 服务器处理请求的方式。 for 2. 你可以禁止标准输出记录 pip install -q package-name,如果你仍然想要完整的详细日志,你可以添加 --log 选项以及指向一个文件 【参考方案1】:

您可以像这样存储 Pip 在~/.netrc 中使用的凭据:

machine pypi.example.com
    login johndoe
    password changeme

Pip 将在访问 https://pypi.example.com 时使用这些凭据,但不会记录它们。您必须单独指定索引服务器(例如问题中的pip.conf)。

请注意,~/.netrc 必须由用户拥有,pip 执行为。任何其他用户也不能读取它。无效文件会被静默忽略。您可以像这样确保权限正确:

chown $USER ~/.netrc
chmod 0600 ~/.netrc

此权限检查在 Python 3.4 之前不适用,但无论如何这都是个好主意。

在发出 HTTP 请求时,Pip 在内部使用requests。 requests 使用标准库netrc 模块读取文件,因此字符集仅限于ASCII子集。

【讨论】:

谢谢!这样可行。奇怪的是,pip 本身如果依赖 requests 就没有这样的功能。 这太棒了!使用 .netrcpip.conf 之间的一个重要区别是,在 .netrc 中,带有特殊字符的密码不得进行 URL 编码,而在 pip.conf 中是必需的。 作为补充评论,对于那些想知道的人,此解决方案适用于 linux 和 windows。 嗨@twm 我尝试了您的解决方案,但 pip 一直忽略配置的密码。我在这里问了一个新问题link。【参考方案2】:

如何将用户名/密码存储为环境变量,

export username=username
export password=password

并在 pip.conf 中像这样引用它们:

[global]
index = https://$username:$password@pypi.example.com/pypi
index-url = https://$username:$password@pypi.example.com/simple
cert = /etc/ssl/certs/ca-certificates.crt

我使用 Gitlab CI 的秘密变量来存储凭据。检查 CI 工具中的等效项。

【讨论】:

对于第二部分@MarkAWard 的建议似乎可以解决问题。 感谢您的回复!其实我最初是按照你的建议做的。我还使用 GitLab CI,并将用户名和密码存储为环境变量。问题是,pip install 在输出日志中显示用户名和密码。但这里来自@MarkAWard 的建议有所帮助。目前只剩下一个问题,不知道有没有办法在GtiLab CI中禁止echo $usernameecho $password输出? @rahul 您使用的是什么版本的 pip。我无法使用花括号和不使用花括号选项在 pip.conf 中解析环境变量 解决了吗?即使我无法在 pip.conf 中解析变量。我使用的是 8.0.2 版 也无法正常工作。很高兴拥有【参考方案3】:

鉴于issue 4789 仍处于打开状态,您可以在您的 requirements.txt 中使用以下方法:

--extra-index-url=https://$PYPI_USERNAME:$PYPI_PASSWORD@my.privatepypi.com
private-package==1.2.3
...

如果您尝试在设置了这些环境变量的情况下运行pip install requirements.txt,您会发现 pip 仍然要求提供凭据。这是因为 pip 没有像人们期望的那样插入表达式$PYPI_USERNAME,而是 url 对其进行编码。本例中您的用户名和密码表示为https://%24%7BPYPI_USERNAME%7D:%24%7BPYPI_PASSWORD%7D@my.privatepypi.com

这里的工作,我承认应该有更好的方法,但我们可以将 pip 作为脚本运行:

python3 -m pip install -r requirements.txt

来自男人:

 -m module-name
    Searches sys.path for the named module and runs the corresponding .py file as a script.

【讨论】:

以上是关于pip.conf 中用于私有 PyPI 的凭据的主要内容,如果未能解决你的问题,请参考以下文章

pip.conf 不关注可信主机

设置私有 pypi 包?

如何使用 setup.py 安装托管在私有 PyPI 中的包?

防止私有和基于 pypi 的 Python 包之间的命名空间冲突

如何从经过身份验证的私有 Artifactory PyPI 存储库中提取 Python 包?

在 PHP 中保持 MySQL 凭据私有的最佳方法是啥?