Я не могу добавить репозиторий PPA за прокси

14

Я пытаюсь добавить репозиторий ppa (как root) с помощью следующей команды:

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 Largefile 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

ПИКРЛОВЫЕ ГОЛОВКИ

Заголовки отправлены:

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 не пересылает авторизацию по запросу.

kenorb
источник
Спасибо, я пытался, но это не помогает. Чтобы убедиться, что это не так, я включил свои учетные данные в .curlrc (без экранирования @, кажется, работает для стандартной команды curl), но не для pycurl. Смотрите обновленный раздел.
kenorb
Спасибо, я думал, что что-то пропустил. Я сообщил об ошибке здесь: bugs.launchpad.net/ubuntu/+source/apt/+bug/1075180
kenorb
Вы также установили https_proxy? См черепашки bugs.launchpad.net/ubuntu/+source/software-properties/+bug/...
попей
Может быть, это проблема, связанная с сессиями и изменениями среды. Вы можете попробовать экспортировать http_proxy и https_proxy в / etc / profile, затем перезагрузить компьютер (если это возможно) и повторить попытку.
jap1968 30.12.12
В связи с тем, что jap1968 говорит выше меня, я убедился, что установлены и http_proxy, и HTTP_PROXY (и https_proxy и HTTPS_PROXY). Благодаря чувствительности к регистру в Linux это фактически две разные переменные, и, что самое приятное, не все программы будут использовать одну или другую. Конечно, это больше похоже на проблему с отправкой комбинации имени пользователя и пароля (из-за '@'), но в любом случае это стоит попробовать.
YellowApple

Ответы:

10

Обходной путь, если apt-getвсе еще работает за прокси

  • добавить источники вручную /etc/apt/sources.list
  • добавить ключ gpg

Добавление источников вручную

Я думаю, что на launchpad.net каждый ppa все еще содержит небольшое описание, как добавлять источники вручную. Сайт панели запуска для вашего упомянутого ppa ppa:nilarimogard/webupd8- https://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/InstallSoftware

Поскольку использование apt-ключа в описанном виде не является типичным, я нашел информацию только на страницах руководства man apt-key.

Соответствующий ответ, который в значительной степени описывает стандартный способ установки ppa вручную: /ubuntu//a/38029/128349

Леор
источник
@kenorb не знаю, получите ли вы уведомление, если я отредактирую свой пост, поэтому: ping: «возможный обходной путь»
LeoR
Если ваша проблема заключается в том, что порт 11371 заблокирован в корпоративном брандмауэре, теперь вы можете использовать вместо него порт 80: "sudo apt-key adv --keyserver hkp: //keyserver.ubuntu.com: 80 --recv-keys 4C9D234C "
leszek.hanusz
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.

Я дал подробное описание этого здесь в моем блоге .

Jobin
источник
1

Убедитесь, что apt proxy установлен как показано ниже

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/

Это должно работать.

Manjula
источник