Туннелирование git через ssh (чтобы пройти через брандмауэр): спецификация порта interperted как относительный путь?

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

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

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

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

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.

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

5
задан Kristin
22.12.2022 18:16 Количество просмотров материала 3158
Распечатать страницу

1 ответ

почему это не работает

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

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

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

localhost:3333/path/to/repo.git

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

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

Git рассматривает его как эквивалент ssh://[user@]host[:port]/path URL-адреса, за исключением адресов в стиле 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-сервер.

5
отвечен grawity 2022-12-24 02:04

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх