4

У меня есть доступ к серверу A через ssh, а с сервера A можно получить доступ к серверу B, который запускает gitlabs и содержит репозиторий, к которому мне нужен доступ. Когда я ssh'd на сервере A, я могу успешно запустить git clone http://serverB/path/to/repo.git . Использование ssh:// или git:// вместо http:// не работает. (Ошибки «не похоже на git-репозиторий» и "невозможно подключиться к serverB" соответственно.)

Если я настрою туннель так:

ssh username@serverA -L 3333:serverB:80 -N

Следующие две попытки клонов git не удаются:

git clone http://localhost:3333/path/to/repo.git

Сбой с: "роковым: хранилище не найдено"

git clone localhost:3333/path/to/repo.git

Запрашивает у меня пароль для serverB, а затем выдает сообщение «fatal: 3333/path/to/repo.git не является git-репозиторием». Конечно нет! Моя попытка указать localhost, порт 3333, явно интерпретируется как относительный путь на serverB.

Есть ли способ это исправить? Что-то в корне не так с этим подходом?

1 ответ1

5

Почему не работает

http://localhost:3333/path/to/repo.git

Это терпит неудачу, потому что имя хоста URL отличается (localhost vs server2), и в результате сервер использует другую конфигурацию.

Все клиенты HTTP отправляют запрошенное имя хоста на сервер, и сервер может выбрать одну из нескольких конфигураций (виртуальных хостов) на основе этого имени. Это то, сколько веб-сайтов (часто сотни) могут использовать один и тот же IP-адрес у хостинг-провайдера.

localhost:3333/path/to/repo.git

Это терпит неудачу, потому что это не URL-адрес HTTP, или фактически любой URL. (Git не является веб-браузером и не принимает http:// по умолчанию.)

Вместо этого это SSH-адрес в стиле rcp в форме [user@]host:path . Вы могли видеть это раньше как git@github.com:foo/bar.git , где префикс ssh@ - это просто имя пользователя SSH.

Git рассматривает его как эквивалент URL-адреса ssh://[user@]host[:port]/path , за исключением того, что адреса в стиле rcp вообще не имеют поля порта.

Что делать

curl, HTTP-клиент, используемый Git, поддерживает прокси-серверы SOCKS, предоставляемые динамическим туннелем ssh -D .

  1. Установите динамический (SOCKS) туннель с:

    ssh username@serverA -D 1080 -N
    
  2. Настройте Git для использования в качестве прокси:

    Глобально (или для каждого хранилища):

    git config [--global] http.proxy socks5://localhost:1080
    

    Для одной команды:

    git -c http.proxy=socks5://localhost:1080 clone http://serverB/repo.git
    

Протоколы socks5 и socks4 выполняют разрешение DNS на стороне клиента, тогда как socks5h и socks4a передают все имена хостов через SOCKS на сервер SSH.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .