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.