我无法在代理后面添加PPA存储库


14

我正在尝试使用以下命令添加ppa存储库(作为根):

export HTTP_PROXY="http://firstname.surname@xxx.com:my_pass@165.x.x.232:8080"
add-apt-repository ppa:nilarimogard/webupd8


Traceback (most recent call last):
  File "/usr/bin/add-apt-repository", line 125, in <module>
    ppa_info = get_ppa_info_from_lp(user, ppa_name)
  File "/usr/lib/python2.7/dist-packages/softwareproperties/ppa.py", line 84, in get_ppa_info_from_lp
    curl.perform()
pycurl.error: (56, 'Received HTTP code 407 from proxy after CONNECT')

不幸的是,它不起作用。看起来curl正在连接到代理,但是代理说需要验证。我尝试使用.curlrc,http_proxy env代替,但是它不起作用。

strace -e network,write -s1000 add-apt-repository ppa:nilarimogard/webupd8
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 4
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("165.x.x.232")}, 16) = -1 EINPROGRESS (Operation now in progress)
getsockopt(4, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
getpeername(4, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("165.x.x.232")}, [16]) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(46025), sin_addr=inet_addr("161.20.75.220")}, [16]) = 0
sendto(4, "CONNECT launchpad.net:443 HTTP/1.1\r\nHost: launchpad.net:443\r\nUser-Agent: PycURL/7.22.0\r\nProxy-Connection: Keep-Alive\r\nAccept: application/json\r\n\r\n", 146, MSG_NOSIGNAL, NULL, 0) = 146
recvfrom(4, "HTTP/1.1 407 Proxy Authentication Required\r\nProxy-Authenticate: BASIC realm=\"proxy\"\r\nCache-Control: no-cache\r\nPragma: no-cache\r\nContent-Type: text/html; charset=utf-8\r\nProxy-Connection: close\r\nSet-Cookie: BCSI-CS-91b9906520151dad=2; Path=/\r\nConnection: close\

也许是因为用户名中有@登录?Wget可以正常使用代理。

相关: 如何从代理后面添加存储库?

环境

Ubuntu 12.04

curl 7.22.0(x86_64-pc-linux-gnu)libcurl / 7.22.0 OpenSSL / 1.0.1 zlib / 1.2.3.4 libidn / 1.23 librtmp / 2.3

curl功能:GSS协商IDN IPv6大文件NTLM NTLM_WB SSL libz TLS-SRP

更新

将凭据添加到.curlrc中时

cat ~/.curlrc 
proxy = 165.x.x.232:8080
proxy-user = name.surname@xxx.com:mypass0

它似乎适合平淡的卷发

curl www.google.com | head

* Proxy auth using Basic with user 'name.surname@xxx.com'
GET HTTP://www.google.com HTTP/1.1
Proxy-Authorization: Basic cmFmYWwud2llY3pvcmVrQHVi...3R0RDA=
HTTP/1.1 302 Found

也是HTTPS:

curl -v https://www.google.com | head
* Establish HTTP proxy tunnel to www.google.com:443
* Proxy auth using Basic with user 'name.surname@xxx.com'
> CONNECT www.google.com:443 HTTP/1.1
> Host: www.google.com:443
> Proxy-Authorization: Basic cmFmYWwud2llY3pvcmVrQHVi...3R0RDA=
    > User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1     zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Proxy-Connection: Keep-Alive
< HTTP/1.1 200 Connection established
* Proxy replied OK to CONNECT request
* successfully set certificate verify locations

但是在添加ppa证书时仍然不起作用。

pycurl.error: (56, 'Received HTTP code 407 from proxy after CONNECT')

卷标头

标头已发送:

CONNECT launchpad.net:443 HTTP/1.1
Host: launchpad.net:443
Proxy-Authorization: Basic cGVvcGxlcmVhbGx5c2hvdWxkQHNhbml0aXplcG9zdHM=
User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Proxy-Connection: Keep-Alive

回复:

HTTP/1.1 200 Connection established

PyCURL标题

标头已发送:

CONNECT launchpad.net:443 HTTP/1.1
Host: launchpad.net:443
User-Agent: PycURL/7.22.0
Proxy-Connection: Keep-Alive
Accept: application/json

回复:

HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: BASIC realm="proxy"

似乎PyCURL在被请求时不会重新发送任何授权。


谢谢,我已经尝试过了,但这无济于事。为确保不是这种情况,我在.curlrc中包含了我的凭据(对于标准curl命令,没有转义@似乎适用),但对于pycurl不行。请参阅更新的部分。
kenorb 2012年

谢谢,我以为我错过了什么。我在这里报告了该错误:bugs.launchpad.net/ubuntu/+source/apt/+bug/1075180
kenorb 2012年

您还设置了https_proxy吗?见错误bugs.launchpad.net/ubuntu/+source/software-properties/+bug/...
popey

也许这是与会话和环境变量有关的问题。您可以尝试在/ etc / profile中导出http_proxy和https_proxy,然后重新引导计算机(如果可能),然后重试。
jap1968

与jap1968在我上面说的有关,我确保同时设置了http_proxy HTTP_PROXY(以及https_proxy和HTTPS_PROXY)。由于Linux区分大小写,实际上它们是两个不同的变量-最好的是,并非所有程序都将使用一个或另一个。当然,这听起来更像是用户名/密码组合发送方式的问题(因为“ @”),但还是值得一试的。
YellowApple

Answers:


10

如果apt-get仍可在代理后面工作的解决方法

  • 手动将源添加到 /etc/apt/sources.list
  • 添加gpg密钥

手动添加源

我认为在launchpad.net上,每个ppa仍然包含有关如何手动添加源的小描述。您提到的ppa的启动板站点ppa:nilarimogard/webupd8https://launchpad.net/~nilarimogard/+archive/webupd8。如果向下滚动,则会看到一个展开的标签关于此PPA的技术详细信息。如果展开它,则会找到有关如何手动添加源的说明。将以下几行添加到提及的内容中/etc/apt/sources.list

deb http://ppa.launchpad.net/nilarimogard/webupd8/ubuntu quantal main 
deb-src http://ppa.launchpad.net/nilarimogard/webupd8/ubuntu quantal main 

当然,您必须将量化调整为当前使用的任何版本。

添加签名密钥

该说明还包含一个签名密钥。这很重要,因此您的系统始终可以验证您实际上访问的是可信任的ppa地址。如果您的ppa是1024R/4C9D234C(也可以在有关此PPA的技术详细信息下找到),则斜杠后面的数字很重要。您可以通过apt-key程序添加指纹。通常,您将执行以下命令

 sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 4C9D234C

如果apt-key无法通过代理添加,则添加

由于您已经对该add-apt-repository程序有问题,因此也可能不起作用。因此,您可以手动下载并添加1024位密钥。如果wget可行,您可以一步一步完成。

wget "http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x531EE72F4C9D234C" -O out && sudo apt-key add out && rm out

否则可以安全地添加“ http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x531EE72F4C9D234C/path/key并用于sudo apt-key add /path/key添加。

与平时一样

之后,您必须更新存储库信息apt-get update,然后您应该能够下载软件包。

资源资源

我个人最喜欢如何使用打包机制(德语):http : //wiki.ubuntuusers.de/Paketquellen_freischalten/PPA

启动板版本还提到了所有重要点:https : //help.launchpad.net/Packaging/PPA/InstallingSoftware

由于以上述方式使用apt-key是不典型的,因此我仅在手册页中找到该信息man apt-key

相关答案几乎描述了手动安装ppa的标准方法:https : //askubuntu.com/a/38029/128349


@kenorb不知道如果我编辑我的帖子是否会收到通知,所以:ping: “可能的解决方法”
LeoR 2013年

如果您的问题是公司防火墙中的端口11371被阻止,则可以改为使用端口80:“ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 4C9D234C “
leszek.hanusz 2014年

7

实际上,它似乎比以前发布的答案容易得多。您只需要“ sudo”即可知道您位于代理之后,它将毫不费力地工作。为此,您需要导出代理http以及https通常的导出方式:

export http_proxy=http://username:password@host:port/
export https_proxy=https://username:password@host:port/

然后添加Defaults env_keep="https_proxy"/etc/sudoers文件末尾。之后,您应该可以使用以下命令添加ppa:

sudo add-apt-repository ppa:the_ppa_you_want_to_add

或使用

sudo -E add-apt-repository ppa:the_ppa_you_want_to_add

如果您不想修改/etc/sudoers文件。该-E选项将环境变量导出到sudo用户。

在博客上对此进行了详细说明。


1

确保apt代理设置如下

sudo vi /etc/apt/apt.conf

添加以下代理设置并保存文件

Acquire::http::proxy "http ://proxy.company.com:port/";
Acquire::https::proxy "https ://proxy.company.com:port/";
Acquire::ftp::proxy "ftp://proxy.company.com:port/";

在运行命令之前,还要在终端中导出以下内容

export http_proxy=http ://proxy.company.com:port/
export https_proxy=https ://proxy.company.com:port/

这应该工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.