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

我正在尝试按照wiki.linaro.org上的“在Ubuntu 10.04(Lucid)和10.10(Maverick)主机上安装交叉工具链”的指南进行操作(在我的Ubuntu 10.04虚拟机上)。第一步是:
sudo add-apt-repository ppa:linaro-maintainers/toolchain

但是当我运行时,我得到了以下结果:
Error reading https://launchpad.net/api/1.0/~linaro-maintainers/+archive/toolchain: <urlopen error [Errno 110] Connection timed out>

我猜问题出在我雇主的代理服务器配置上,尤其是针对HTTPS的部分。
当我在Firefox中打开https://launchpad.net/api/1.0/~linaro-maintainers/+archive/toolchain时,出现了“连接超时”的提示。然后我进入Firefox首选项 -> 高级 -> 网络 -> 设置...,将HTTP代理设置为“gateway”,端口设置为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"

...就像bug 516032的评论18中所述,但我仍然遇到相同的“gpgkeys: HTTP fetch error 7: couldn't connect to host”错误。

而且这很奇怪:

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

因为没有http_proxy。
欢迎任何建议。
更新 #3:由于我的虚拟机的主机是一台笔记本电脑,我把它带回家并在那里尝试(没有代理)。
$ 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)

它起作用了。所以问题与代理配置有关。但我想我有一个解决方法。

仅供参考http://askubuntu.com/questions/60217/apt-get-update-with-an-in-password-error - Deepak Rajput
16个回答

除了配置代理,还要告诉sudo使用-E选项来保留环境设置。
export http_proxy=http://<proxy>:<port>
export https_proxy=http://<proxy>:<port>
sudo -E add-apt-repository ppa:linaro-maintainers/toolchain

使用用户名和密码:

export https_proxy=https://<username>:<password>@<proxy>:<port>

真的做得很好 - Shashwat Kumar
15-在完成了上述的所有其他事情之后,E帮我解决了问题,现在它正常工作。 - cschooley
2是的,https_proxy 配置是必须的... :P - monkut
3如何永久添加代理并避免使用-E开关?我已经正确配置了/etc/environment文件,并添加了相应的行...谢谢。 - Enrique
1man sudo-E, --preserve-env 表示用户希望保留其现有的环境变量给安全策略。如果用户没有权限保留环境,则安全策略可能会返回错误。 - Pablo Bianchi

在终端中使用以下代码来在代理后添加gpg密钥。
sudo apt-key adv --keyserver-options http-proxy=http://USER:PASSWORD@PROXY_URL:PORT/ --keyserver keyserver.ubuntu.com --recv-keys GPG_KEY

根据需要替换大写字母。如果您使用的是没有用户身份验证(即用户名和密码)的代理,请改用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

如果您没有用户身份验证,只需使用以下方法:
sudo apt-key adv --keyserver-options http-proxy=http://10.10.2.21:3128/ --keyserver keyserver.ubuntu.com --recv-keys C2514567EEA14886

3这实际上并没有“修复”add-apt-repository命令的执行。事实上,它只是解决了其中一个任务的问题。 至少需要一个额外的命令:sudoedit /etc/apt/sources.list.d/XXXX.list + 手动编辑以添加deb URL... - Chucky
如果您能提供一些关于如何永久修复代理的信息,那就太完美了。您提供的解决方案需要大量的输入。 - Danatela

终于!你需要通过以下方式设置 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

e.g.:

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

翻译成中文:Boom,Voila!

是的。这对我来说有效,在Debian 7上安装Mono时:sudo -E apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF - ken

你的sudoers更改没有按预期工作的原因是,你使用了错误的方法:
    Defaults env_keep="http_proxy"
    Defaults env_keep="https_proxy"

你应该写成:
    Defaults env_keep+="http_proxy"
    Defaults env_keep+="https_proxy"

还要确保Defaultsenv_keep之间的空格每次都是一个制表符。

这个四步骤的方法对我在一个企业代理后面的Ubuntu 17.04虚拟机上有效。
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现在应该可以正常工作。
请注意,主机虚拟机在3128端口上运行了一个CNTLM代理服务器。

1你不必等待apt告诉你密钥是什么。它在PPA的技术细节中已经有了:“指纹:80F70E11F0F0D5F10CB20E62F5DA5F09C3173AA6”。 - muru
没错,但我觉得这个过程稍微简单一些。 - thegreendroid

我通过编辑`/usr/lib/python3/dist-packages/softwareproperties/ppa.py`并添加代码来解决了这个问题。
"--keyserver-options", "http-proxy=<proxy_url>",

在下面的线条下方
"--keyserver", self.keyserver,

更多背景信息

ppa.py是一个Python脚本,由add-apt-repository调用以调用gpg。有时候会出现gpg的bug,它不使用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

我猜在这个命令中有一些不必要的环境变量,但它们并不会造成任何问题。

/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的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即可。还可以从emdebian获取交叉工具链,并在此处提供一些说明:http://gsoc.sitedethib.com/posts/apt-get_install_gcc-4.7-arm-linux-gnueabihf/

你是怎么知道代理应该以01开头而不是其他数字的呢? - jgomo3
无法使用apt-get和keyserver工作 - Vik