如何让add-apt-repository通过代理工作?

我正在尝试按照wiki.linaro.org (在我的Ubuntu 10.04 VM上)上的“在Ubuntu 10.04(Lucid)和10.10(Maverick)主机上安装交叉工具链”的说明 。 第一步是:

sudo add-apt-repository ppa:linaro-maintainers/toolchain 

但当我跑步时,我得到:

 Error reading https://launchpad.net/api/1.0/~linaro-maintainers/+archive/toolchain:  

我猜测问题出在我的雇主代理服务器的配置上,特别是对于HTTPS。

当我在Firefox中打开https://launchpad.net/api/1.0/~linaro-maintainers/+archive/toolchain时,我得到了“连接超时”。 然后我进入Firefox首选项 – >高级 – >网络 – >设置…并将HTTP代理设置为“网关”,将端口设置为8080,并选中“将此代理服务器用于所有协议”。 然后页面加载。 这支持了我的理论。

我已经尝试设置http_proxy和https_proxy环境变量(大小写和大写):

 $ set | grep -i proxy HTTPS_PROXY=https://gateway:8080 HTTP_PROXY=http://gateway:8080 http_proxy=http://gateway:8080 https_proxy=https://gateway:8080 

我也尝试将它们改为:

 $ set | grep -i proxy HTTPS_PROXY=gateway:8080 HTTP_PROXY=gateway:8080 http_proxy=gateway:8080 https_proxy=gateway:8080 

我尝试将第二行添加到/etc/apt/apt.conf:

 Acquire::http::proxy "http://gateway:8080/"; Acquire::https::proxy "https://gateway:8080/"; 

但我继续得到同样的错误。

我该如何解决这个问题?

更新:我按照“添加存储库并从代理后面的终端连接问题”的接受答案中的说明进行了进一步说明:

 $ sudo add-apt-repository ppa:linaro-maintainers/toolchain Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /etc/apt/secring.gpg --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver keyserver.ubuntu.com --recv 1DD749B890A6F66D050D985CF1FCBACA7BE1F97B gpg: requesting key 7BE1F97B from hkp server keyserver.ubuntu.com gpgkeys: HTTP fetch error 7: couldn't connect to host gpg: no valid OpenPGP data found. gpg: Total number processed: 0 

我想知道“HTTP fetch error”是否意味着我还需要在/etc/sudoers添加“Defaults env_keep = http_proxy”…

更新#2:我补充说:

 Defaults env_keep="http_proxy" Defaults env_keep="https_proxy" 

…如评论18中的错误516032 ,但我仍然得到相同的“gpgkeys:HTTP获取错误7:无法连接到主机”错误。

这很奇怪:

 $ sudo env | grep proxy https_proxy=https://gateway:8080 

…因为http_proxy不在那里。

任何建议表示赞赏。

更新#3:由于我的VM的主机是笔记本电脑,我把它带回家并在那里尝试(没有代理):

 $ sudo add-apt-repository ppa:linaro-maintainers/toolchain Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /etc/apt/secring.gpg --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver keyserver.ubuntu.com --recv 1DD749B890A6F66D050D985CF1FCBACA7BE1F97B gpg: requesting key 7BE1F97B from hkp server keyserver.ubuntu.com gpg: key 7BE1F97B: public key "Launchpad Linaro Overlay PPA" imported gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1) 

有效。 所以问题与代理配置有关。 但我想我有一个解决方法。

除了配置代理之外,请告诉sudo使用-E选项保留环境:

 export http_proxy=http://: export https_proxy=http://: sudo -E add-apt-repository ppa:linaro-maintainers/toolchain 

用户名和密码:

 export https_proxy=https://:@: 

在终端中使用以下代码在代理后面添加gpg密钥,

 sudo apt-key adv --keyserver-options http-proxy=http://USER:PASSWORD@PROXY_URL:PORT/ --keyserver keyserver.ubuntu.com --recv-keys GPG_KEY 

并相应地替换大写字母。 如果您使用没有任何用户身份validation的代理(即用户名和密码),请使用http-proxy=http://PROXY_URL:PORT/

例如,你可以使用GPG_KEY=C2514567EEA14886

 sudo apt-key adv --keyserver-options http-proxy=http://user:abc123@10.10.2.21:3128/ --keyserver keyserver.ubuntu.com --recv-keys C2514567EEA14886 

哪里,

 USER_ID=user PASSWORD=abc123 PROXY_URL=10.10.2.21 PORT=3128 

如果您没有用户身份validation,只需使用,

 sudo apt-key adv --keyserver-options http-proxy=http://10.10.2.21:3128/ --keyserver keyserver.ubuntu.com --recv-keys C2514567EEA14886 

最后! 您需要通过以下方式设置https_proxy:

 export https_proxy=.... 

只设置http_proxy是不够的。

我需要以root身份执行add-apt-repository命令,而不是通过sudo执行。

码:

 sudo su add-apt-repository ppa:........ 

似乎代理配置已设置但无论如何无法联系服务器…

我有一个非常类似的问题,我解决了这个问题:公司代理只允许端口80和443出于安全原因,所以当它设置时,因为HKP协议使用端口11371,它不会让你通过。

因此,如果没有SSH出来并从外部的一台服务器获取密钥,下载并在本地安装密钥,您可以从下面列出的密钥服务器中指定密钥服务器并指定端口:

http://sks-keyservers.net/overview-of-pools.php

例如:

 apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys XXXXX 

呜咽,瞧!

你的sudoers改变的原因没有按预期工作,而不是:

  Defaults env_keep="http_proxy" Defaults env_keep="https_proxy" 

你应该写:

  Defaults env_keep+="http_proxy" Defaults env_keep+="https_proxy" 

还要确保Defaultsenv_keep之间的空格env_keep都是一个选项卡。

我设法通过编辑/usr/lib/python3/dist-packages/softwareproperties/ppa.py并添加来解决此问题

 "--keyserver-options", "http-proxy=", 

在以下行

 "--keyserver", self.keyserver, 

更多背景资料

ppa.pyadd-apt-repository用来调用gpg的python脚本。 gpg似乎有一个错误,它不使用http_proxy环境变量。 这可以通过查看文件/root/.gnupg/dirmngr.conf并检查以查看honor-http-proxy未被注释掉来确认。

这对我有所帮助:

 sudo https_proxy='https://user:password@proxyhost:port/' \ http_proxy='http://user:password@proxyhost:port/' \ ftp_proxy='ftp://user:password@proxyhost:port/' \ no_proxy=localhost,127.0.0.0/8,10.0.0.0/8 add-apt-repository ppa:webupd8team/java 

我想在命令中不需要一些环境变量,但它们不会造成伤害。

手动将PPA添加到/etc/apt/sources.list

 deb http://ppa.launchpad.net///ubuntu trusty main 

保存文件并运行sudo apt-get update 。 可能会弹出此错误:

 W: GPG error: http://ppa.launchpad.net trusty InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5BB92C09DB82666C 

运行以下命令以接受PPA的密钥,记住更改相应PPA的密钥(5BB92C09DB82666C)。

 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 5BB92C09DB82666C 

运行sudo apt-get update ,你就完成了。

参考: 如何在Debian中通过add-apt-repository命令添加Launchpad PPA

实际上,我遇到了同样的问题,这就是我找到这个页面的方式。

  • 环境变量http_proxy(区分大小写)和https_proxy(无论如何)做一些事情。 在第一阶段没有设置它们失败,设置环境变量似乎确实有一些影响; 如果你不导出它们将会失败

     TCRKVMW ~ $ sudo su - TCRKVMW ~ # export http_proxy=http://10.54.0.4:8080/ TCRKVMW ~ # export https_proxy=http://10.54.0.4:8080/ TCRKVMW ~ # add-apt-repository ppa:webupd8team/java You are about to add the following PPA: Oracle Java (JDK) Installer (automatically downloads and installs Oracle JDK7 / JDK8 / JDK9). There are no actual Java files in this PPA. 

    (其余的都是成功的 – 这一次)

事情是,有时,它只是卡住并以通常的超时消息结束:无法添加PPA:’“错误阅读https://launchpad.net/api/1.0/~webupd8team/+archive/java:(7 ,’无法连接到launchpad.net端口443:连接超时’)“’。

……但是我在作弊,我正在做这一切。 一个简单的解决方案是编辑/ etc / profile,或者在Ubuntu / Mint上,只需在/etc/profile.d中添加一个脚本:

  TCRKVMW ~ $ sudo su -c 'F=/etc/profile.d/proxy.sh S="export proxy_http=\"http://192.168.99.4\"\nexport proxy_https=\"http://192.168.99.4\"" ; echo -e ${S} > ${F} ; chmod 700 ${F}' 

哦,是的,还有关于curl的东西(顺便说一句,apt-add-repository使用它)。 手册说要在你的主目录中添加.curlrc。 因为apt-add-directory是root用户的,所以这意味着将它添加到/root/.curlrc:

  proxy_http="http://192.168.99.4" proxy_https="http://192.168.99.4" 

一个好主意是在你自己的〜/ .curlrc中做同样的事情

此外,在/ etc / wgetrc中启用代理是一件好事,虽然它与问题无关,我只是在Google上保存另一个搜索(如果你读了这个,你有多个代理)…

这个四步法在我公司代理后面的Ubuntu 17.04 VM上运行。

  1. sudo apt-add-repository ppa:brightbox/ruby-ng让它失败
  2. sudo apt update并查找错误消息, The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F5DA5F09C3173AA6
  3. sudo apt-key adv --keyserver-options http-proxy=http://10.0.2.2:3128 --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys F5DA5F09C3173AA6
  4. sudo apt update现在可以使用了

请注意,主机VM正在端口3128上运行CNTLM代理服务器。

在终端中执行以下命令

 export http_proxy=http://username:password@proxyserver.net:port/ export ftp_proxy=http://username:password@proxyserver.netport/ 

系统范围的环境变量应该真正添加到/etc/environment (使用sudogksu ),但报告给你的错误似乎表明没有找到gpg数据。 思路:

  • 检查代理设置(如果您有权访问)
  • 检查代理是否以某种方式重置加密流量的输出。
  • 运行连续的netstat以查看是否实际上正在建立与代理的连接
  • 最后的手段是tcpdump&wires in wireshark
  • 尝试一个http隧道;)

/etc/apt/apt.conf.d/01proxy添加这样的东西

 Acquire::http { Proxy "http://192.168.0.99:3142"; }; 

这将代理所有 aptitude下载,但我认为这是在后端执行此操作的唯一方法。 如果你的代理支持它,你也可以使用像http://my.proxy:port/www.target.site.com/url这样的http://my.proxy:port/www.target.site.com/url ,我知道它适用于apt-cache-ng

我不确定add-apt-repository是否自己使用这些设置,但是如果你无法做到这一点,你可以随时将存储库添加到/etc/apt/sources.list/etc/apt/sources.list.d/*mytoolchain*

从11.10开始,主回购中还有一个交叉工具apt-get install gcc-arm-linux-gnueabihf ,只需要apt-get install gcc-arm-linux-gnueabihf 。 还有来自emdebian的交叉工具链,以及一些说明: http ://gsoc.sitedethib.com/posts/apt-get_install_gcc-4.7-arm-linux-gnueabihf/