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

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

export HTTP_PROXY="http://firstname.surname@xxx.com:my_pass@165.xx232:8080" add-apt-repository ppa:nilarimogard/webupd8 Traceback (most recent call last): File "/usr/bin/add-apt-repository", line 125, in  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正在连接到代理,但代理表示身份validation是必需的。 我尝试过使用.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.xx232")}, 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.xx232")}, [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

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

UPDATE

将凭据添加到.curlrc时

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

它似乎适用于普通的curl

 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') 

CURL HEADERS

标题已发送:

 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在请求时不会重新发送任何授权。

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

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

手动添加源

我认为在launchpad.net上每个ppa仍然包含一个如何手动添加源的小描述。 您提到的ppa ppa:nilarimogard/webupd8的启动板网站ppa:nilarimogard/webupd8是https://launchpad.net/~nilarimogard/+archive/webupd8 。 如果向下滚动,您会看到有关此PPA的可扩展标签技术详细信息 。 如果展开它,则会找到如何手动添加源的说明。 /etc/apt/sources.list添加到提到的/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 

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

添加签名密钥

该描述还包含签名密钥 。 这很重要,因此您的系统始终可以validation您是否真正访问了值得信赖的ppa-address。 如果你的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 

否则在/path/key安全“ http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x531EE72F4C9D234C ”并使用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手册中找到了信息, man apt-key

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

实际上它似乎比以前发布的答案容易得多。 你只需要“sudo”就可以知道你是代理的后面,它会毫不费力地工作。 为此,您需要按照通常的方式导出httphttps的代理:

 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用户。

我已在博客上详细介绍了这一点 。

确保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/ 

这应该工作。