Escape @ в пароле прокси-сервера git


89

У меня есть конфигурация прокси-сервера git как http.proxy = http: // userId: pwd @ 123 @ipaddress: port, но при клонировании удаленного проекта я получаю ошибку как

Cloning into git...
error: Couldn't resolve proxy '123@ipaddress' while accessing http://git.kernel.org/pub/scm/git/git.git/info/refs

fatal: HTTP request failed

Как избежать символа «@» в пароле?

Пожалуйста, обратите внимание: я не могу изменить пароль.

Ответы:


158

Я бы попробовал использовать закодированное значение URL-адреса символа @ ( %40), если вы передаете пароль в URL-адресе прокси:

http.proxy=http://userId:pwd%40123@ipaddress:port

3
Я пытаюсь проделать тот же трюк, но с «git clone user: pwd% 40123 @ ip: port », и это не работает. Полагаю, git не использует завиток в этой ситуации?
Джозеф Гарвин,

интересно ... не уверен. Вероятно, стоит попробовать посмотреть, что на самом деле отправляется по сети в этом случае.
Джон Велдон,

1
Это мне помогло. Вы должны отдельно url-кодировать части имени и пароля. Это поможет вам избежать проблем со спецсимволами. Например, может быть знак «:», который также приведет к проблемам.
Сталинко

2
Это также замечательно, когда у вас есть '@' в имени пользователя, например, когда у вас есть адреса электронной почты в качестве имен пользователей.
ramdesh

Большое вам спасибо за решение моей проблемы после двух дней борьбы ... действительно трудно найти причину такого рода проблем.
lleiou 01

61

Примечание (ноябрь 2013 г.)

Кодирование URL-адреса (особенно любого специального символа в пароле) - правильное решение. Упомянуто ниже только для URL удаленного репо, а не для прокси используется для разрешения сказал URL удаленного репо.
.netrc

Информацию о указанной кодировке см. В разделе « Процентное кодирование »:

Процентное кодирование, также известное как кодирование URL-адресов , - это механизм кодирования информации в унифицированном идентификаторе ресурса (URI) при определенных обстоятельствах. Хотя это называется кодировкой URL, на самом деле она используется в более общем плане в основном наборе универсальных идентификаторов ресурсов (URI), который включает как универсальный указатель ресурса (URL), так и универсальное имя ресурса (URN). Как таковой, он также используется при подготовке данных медиа-типа application / x-www-form-urlencoded , как это часто бывает при отправке данных HTML- формы в HTTP- запросах.

Зарезервированные символы после процентного кодирования:

!   #   $    &   '   (   )   *   +   ,   /   :   ;   =   ?   @   [   ]
%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D

Оригинальный ответ (май 2011 г.)

Два комментария:

  • иметь пароль для сервера, доступ к которому осуществляется с помощью http (не https) ... странно. Пароль не шифруется при обмене данными между клиентом и сервером;

  • вы можете настроить .netrc(или _netrcдля Windows) в своем $HOME, со следующим содержимым

    ipaddress машины: порт
    логин userId
    пароль pwd @

Curl, используемый Git b за сценой, справился бы с кодировкой нормально, @или нет @.


Спасибо за твои ответы. Сервер был сетевым диском, который буду использовать только я и 2 других разработчика. Так что, думаю, в шифровании нет необходимости. И я когда-нибудь попробую использовать netrc.
Картик

@Karthik: это позволит вам просто использовать: http://123@ipaddress:port/...в качестве адреса для клонирования без необходимости добавлять информацию о пользователе и пароле.
VonC


5

Например, ваш пароль хранится в переменной окружения GIT_PASSWORD, имя пользователя - GIT_USERNAME, затем:

git clone http://${GIT_USERNAME}:$(echo -n $GIT_PASSWORD | hexdump -v -e '"x" 1/1 "%02X"' | tr x %)@repository.git

Объяснение: echo -n $GIT_PASSWORD | hexdump -v -e '"x" 1/1 "%02X"' | tr x %

  1. Распечатать пароль: $GIT_REPOSITORY<-hello
  2. Преобразуйте 'привет' в шестнадцатеричный: hello<-x68x65x6Cx6Cx6F
  3. Измените каждый 'x' на '%': x68x65x6Cx6Cx6F<-%68%65%6C%6C%6F

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.