R中curl请求返回HTTP 407代理错误无法安装包如何解决
问题诱因
HTTP 407错误代表代理要求身份验证,该问题的核心是R环境内的curl包未正确读取到代理认证凭据,对应排查到的现象可逐一印证:
- 命令行curl、浏览器可正常下载目标文件,是因为系统层面的curl配置(
/etc/curlrc、~/.curlrc)或全局环境变量中已经配置了完整的带身份信息的代理参数,R启动时仅继承了代理地址,未继承认证凭据 - 可正常访问GitHub、CRAN仓库是因为这些域名在公司代理白名单内,无需认证即可访问,或R调用了非curl的默认下载方法;访问谷歌、gert安装脚本托管地址
r-lib.github.io不在白名单内,curl包发起请求时无认证信息就会触发407 - 手动在R内清空或错误配置
https_proxy变量,会覆盖原本可正常访问CRAN的默认代理规则,导致仓库索引拉取失败;仅在R内设置代理但不补全认证信息,既无法解决407问题,还会因代理配置不完整触发连接读取错误 - 完全取消bash层面的代理配置会直接导致所有外网请求无法通过公司网络校验,自然会在拉取仓库索引阶段卡死。
R环境curl配置修复方法
- 第一步:在bash终端执行
echo $https_proxy获取当前代理地址,若返回值未包含用户名:密码@前缀,查看~/.curlrc或/etc/curlrc中的proxy-user字段,拿到代理认证的用户名、密码。带完整认证信息的代理格式为http://<用户名>:<密码>@<代理服务器IP>:<代理端口>,密码含特殊字符的需要提前做URL转义(如@转义为%40、:转义为%3A) - 第二步:编辑R的环境配置文件,全局生效编辑
/usr/lib/R/etc/Renviron.site,仅当前用户生效编辑~/.Renviron,写入以下配置:
http_proxy=http://<用户名>:<密码>@<代理服务器IP>:<代理端口> https_proxy=http://<用户名>:<密码>@<代理服务器IP>:<代理端口> no_proxy=localhost,127.0.0.1
- 第三步:完全退出所有R进程,重新在保留系统代理配置的bash终端中启动R,先执行测试命令验证:
curl::curl_download("https://r-lib.github.io/gert/get-libgit2-linux.sh", "test.sh")
测试无报错后,再执行install.packages("badger")即可正常安装。
绕过curl依赖的安装方案
如果不想调整curl代理配置,可通过提前安装系统依赖绕开gert包安装时的在线脚本下载逻辑:
- 在bash终端执行系统命令安装gert依赖的libgit2库:
sudo apt update sudo apt install -y libgit2-dev
系统安装libgit2-dev后,gert编译时会直接调用系统预装的库,不会触发curl下载get-libgit2-linux.sh的流程。
2. 直接在R中执行安装命令即可:
install.packages(c("gert", "badger"))
该方案仅依赖原本可正常访问CRAN的网络配置,不会触发额外的curl外网请求,适配当前网络环境。
内容的提问来源于stack exchange,提问作者Обедающий философ
相关产品推荐
相关产品推荐

